msbuild: Как извлечь элементы без метаданных?

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

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

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

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

Любые идеи были бы хорошы.

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


person h.s.    schedule 14.02.2019    source источник


Ответы (1)


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

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

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

person h.s.    schedule 14.02.2019