2010-01-06 2 views
7

Я пытаюсь создать группу элементов задачи «Файлы» с атрибутом метаданных «TargetPath», заполненным относительным путем к файлу.ItemGroup с пользовательскими метаданными в отношении файлов

Пример:
Для этих путей:

D: \ Test \ Blah.exe
D: \ Test \ Config \ fun.config
D: \ Test \ EN-US \ мой .resources.dll

Вывод должен быть:

Target File = Blah.exe
File Target = Config \ fun.config
File Target = EN-US \ my.resources.dll

Вот моя лучшая попытка ... надеюсь, это делает мой вопрос яснее:

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

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

Я бы хотел, чтобы «TargetPath» заполнялся правильно ... в настоящее время он кажется пустым или пустым. Кто-нибудь знает, что мне не хватает?

Edit:

Да, я понимаю, что я могу это сделать:

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

Однако я строю эту ItemGroup использовать задачу ResolveManifestFiles MSBuild, который требует, чтобы я создать объект TaskItem с атрибутом метаданных TargetPath, чтобы иметь возможность настроить это значение.

ответ

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)"/> 

EDIT:

Этот пример использует CreateItem задачу динамического обновления ItemGroup:

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

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

я вижу, что, тем не менее, я пытаюсь использовать другую задачу, которая опирается на TaskItems я перехожу к нему, чтобы иметь этот атрибут метаданных –

+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: «Bin \ Release \ log4net.длл, бен \ Release \ Newtonsoft.Json.dll; Bin \ Release \ RabbitMQ.Client.dll; Bin \ Release \ ReflectSoftware.Insight.dll»

1

Современная MSBuild не требует CreateTask (так как .NET 3.5)

Вы можете сделать это следующим образом:..

<ItemGroup> 
    <Files Include="d:\test\**\*" /> 
    <FilesWithMetadata Include="%(Files.Identity)" > 
     <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath> 
    </FilesWithMetadata> 
</ItemGroup> 
Смежные вопросы