2010-01-06 5 views
7

파일에 대한 상대 경로로 채워진 "TargetPath"라는 메타 데이터 특성을 사용하여 "파일"작업 항목 그룹을 만들려고합니다.ItemGroup 파일 관련 사용자 지정 메타 데이터 사용

예 : 이러한 경로에 대한
:

D : \ 테스트 \ Blah.exe
D : \ 테스트 \ 구성 \ fun.config
D : \ 테스트 \ EN-US \ 내

.resources.dll 출력은 다음과 같아야합니다

파일 대상 = Blah.exe
파일 대상 = 구성 \의 fun.config
파일 대상 = EN-US \는 my.resources.dll는

여기

내 최고의 시도 ... 희망이있게되고 내 질문에 명확 :

<ItemGroup> 
    <Files Include="d:\test\**\*" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(TargetPath)')"/> 

"TargetPath"를 올바르게 채우고 싶습니다 ... 현재 null이거나 비어있는 것으로 보입니다. 아무도 내가 누락 된 걸 알아?

편집 :

예, 나는이 할 수있는 실현 : 내가 구축하는 것이 필요 ResolveManifestFiles은 MSBuild 작업을 사용하려면이 ItemGroup을 짓고 있어요 그러나

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

을 해당 값을 사용자 정의 할 수있는 TargetPath 메타 데이터 속성이있는 TaskItem

답변

6

동적 메타 데이터를 생성하기 전에 항목 그룹에 할당하려고합니다. 당신의 예에서이 정보는 이미 잘 알려진 메타 데이터의 일부이기 때문에 사용자 정의 메타 데이터를 생성 할 필요가 없다, 그래서 당신은 다만 할 수 있습니다

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/> 

또는 :

<Message Text="File Target = %(Files.RecursiveDir)%(Files.Filename)%(Files.Extension)"/> 

편집 :

<ItemGroup> 
    <Files Include="d:\test\**\*" ></Files> 
</ItemGroup> 

<CreateItem 
    Include="@(Files)" 
    AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)"> 
     <Output TaskParameter="Include" ItemName="Files"/> 
</CreateItem> 
:

이 예제는 동적으로 itemgroup를 업데이트 CreateItem 작업을 사용합니다

+0

을 –

+0

내 참조 대답 업데이트 - 도움이되기를 바랍니다. – KMoraz

0

나는 이런 식으로 사용하는 CreateItem 방법을 좋아하고 : 난 그냥 파일 이름 만 얻을 변환을 사용하고

<ItemGroup> 
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> 
     <HintPath>..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    ... 
    </ItemGroup> 

    <CreateItem Include="@(Reference)" Condition="'%(Reference.Private)' == 'True'" AdditionalMetadata="TargetPath=$([System.IO.Path]::GetFileName(%(Reference.HintPath)))"> 
    <Output TaskParameter="Include" ItemName="DLLFiles"/> 
    </CreateItem> 

    <Message Text="HintPaths: &quot;@(DLLFiles->'$(OutputPath)%(TargetPath)')&quot;" Importance="high" /> 

.

출력 :

HintPaths : "빈 \ 릴리스 \ log4net.DLL; 빈 \ 릴리스 \ Newtonsoft.Json.dll; 빈 \ 릴리스 \ RabbitMQ.Client.dll; 빈 \ 릴리스 \ ReflectSoftware.Insight.dll "

1

현대의 MSBuild는 CreateTask를 (필요하지 않습니다 .NET 3.5 이후)

당신은 이런 식으로 작업을 수행 할 수 있습니다.. 나는, 그러나 나는이 메타 데이터 속성을 가지고 내가 그것을 전달하는 TaskItems에 의존하는 다른 작업을 사용하기 위해 노력하고있어 볼

<ItemGroup> 
    <Files Include="d:\test\**\*" /> 
    <FilesWithMetadata Include="%(Files.Identity)" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </FilesWithMetadata> 
</ItemGroup> 
관련 문제