msbuild: Как извлечь элементы без метаданных? - PullRequest
0 голосов
/ 14 февраля 2019

Из msbuild "Item" я хочу извлечь всех тех участников, у которых нет метаданных (пожалуйста, прости меня, если я использую неправильную терминологию).

Это мой фон: я готовлю файлы длясоздание установочного пакета.Файлы, которые должны входить в пакет, определены в «Item» следующим образом:

<ItemGroup>
  <Files Include="readme.txt" />
  <Files Include="myfile.txt">
    <Rename>help.txt</Rename>
  </Files>
  <Files Include="changes.log" />
  <!-- more files -->
</ItemGroup>

Хотя readme.txt должен быть включен как есть, myfile.txt должен быть переименован в help.txt, потому что кто-торешил, что myfile.txt плохое имя.Я создал последовательность (внутри цели), которая переименовывает файлы с метаданными «Переименовать».

<ItemGroup>
  <FilesToRename Include="@(ChangeLogs->HasMetadata('Rename'))"/>
</ItemGroup>
<Move SourceFiles="@(FilesToRename->'$(WorkDir)\source\%(Identity)')" DestinationFiles="@(FilesToRename->'$(WorkDir)\source\%(Rename)')" />

Для копирования этих файлов в установочный пакет мне нужен элемент, состоящий из имен «Переименовать»для переименованных файлов и оригинальных имен для остальных;в этом примере «readme.txt; help.txt; changes.log» (в любом порядке).Моей первой попыткой было использование «FilesToRename» сверху и добавление «перевернутого» выражения, например:

<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@(Files->Not HasMetadata('Rename'))" />

, но оно не раскрывается.Я также не мог заставить работать «Условие», например

<FilesToCopy Include="@(Files)" Condition="Not @(Files->HasMetadata('Rename'))/>

, что приводит к синтаксической ошибке «Обнаружен неожиданный токен».

Любые идеи приветствуются.

Спасибо, Ганс

1 Ответ

0 голосов
/ 14 февраля 2019

Я мог бы подумать об этом решении раньше ...

<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@Files" Exclude="@(Files->HasMetadata('Rename'))" />

Так просто ...

...