ItemGroup с пользовательскими метаданными относительно файлов - PullRequest
9 голосов
/ 06 января 2010

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

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

D: \ Test \ Blah.exe
D: \ Test \ Config \ fun.config
D: \ Test \ en-US \ my.resources.dll

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

File Target = Blah.exe
File Target = Config \ fun.config
Файл 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, чтобы иметь возможность настроить это значение.

Ответы [ 3 ]

8 голосов
/ 06 января 2010

Вы пытаетесь назначить динамические метаданные группе товаров перед ее созданием. В вашем примере нет необходимости создавать собственные метаданные, так как эта информация уже является частью известных метаданных, поэтому вы можете просто сделать:

<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>
    <Files Include="d:\test\**\*" ></Files>
</ItemGroup>

<CreateItem
    Include="@(Files)"
    AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output TaskParameter="Include" ItemName="Files"/>
</CreateItem>
3 голосов
/ 28 января 2017

Современный MSBuild не требует CreateTask (начиная с .NET 3.5).

Вы можете сделать это так:

<ItemGroup>
    <Files Include="d:\test\**\*" />
    <FilesWithMetadata Include="%(Files.Identity)" >
        <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
    </FilesWithMetadata>
</ItemGroup>
0 голосов
/ 29 февраля 2016

Мне нравится метод 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" />

Я использую Transforms, чтобы получить только имя файла.

Выход:

HintPaths: "Bin \ Release \ log4net.dll; Bin \ Release \ Newtonsoft.Json.dll; Bin \ Release \ RabbitMQ.Client.dll; Bin \ Release \ ReflectSoftware.Insight.dll"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...