2016-09-22 3 views
1

У меня есть куча файлов x.txt в разных каталогах по всему моему проекту. Как часть моего шага сборки, я хотел бы собирать их и размещать в одной папке (без объявления каждого из них). Я могу обнаружить их с помощью:Как использовать преобразование MSBuild, когда файлы ItemGroup имеют одинаковые имена?

<ItemGroup> 
    <MyFiles Include="$(SRCROOT)\**\x.txt"/> 
</ItemGroup> 

Однако, если я скопировать их в одну папку - все они перекрывают друг друга. Я попытался использовать преобразование, где я добавляю GUID для каждого имени файла, но GUID создается только один раз, а затем повторно используется для каждого преобразования (таким образом, они перезаписываются каждый). Есть ли способ генерации уникальных имен в MSBuild при копировании ItemGroup с идентично названными файлами? Схема именования конца не важна, если все файлы находятся в этой папке.

ответ

1

Преобразование работает, но вы должны «заставить» его генерировать новые данные на каждой итерации. Мне потребовалось некоторое время, чтобы понять это, и теперь это имеет смысл, но я не мог найти никакой документации, объясняющей это. Но он работает просто путем ссылки на другие существующие метаданные: msbuild видит, что это нужно оценивать на каждой итерации, чтобы он с радостью оценил любую часть новых метаданных. Пример, просто используя% (FileName):

<Target Name="CreateUniqueNames"> 
    <ItemGroup> 
    <MyFiles Include="$(SRCROOT)\**\x.txt"/> 
    <MyFiles> 
     <Dest>%(Filename)$([System.Guid]::NewGuid())%(FileName)</Dest> 
    </MyFiles> 
    </ItemGroup> 
    <Message Text="%(MyFiles.Identity) -> %(MyFiles.Dest)"/> 
</Target> 

В качестве альтернативы вы можете использовать уникальные метаданные у вас уже есть, а именно RecursiveDir:

<Target Name="CreateUniqueNames"> 
    <ItemGroup> 
    <MyFiles Include="$(SRCROOT)\**\x.txt"/> 
    <MyFiles> 
     <Dest>x_$([System.String]::Copy('%(RecursiveDir)').Replace('\', '_')).txt</Dest> 
    </MyFiles> 
    </ItemGroup> 
    <Message Text="%(MyFiles.Identity) -> %(MyFiles.Dest)"/> 
</Target> 
+1

Я попробовал это, и это прекрасно работает - просто нужно чтобы быть осторожным с постоянно увеличивающимися длинами имен файлов со вторым решением. –

Смежные вопросы