Рекурсивное копирование MSBuild с использованием% (ConfigurationToBuild.PlatformToBuild) - PullRequest
1 голос
/ 14 апреля 2009

У меня есть следующая задача, которая из-за комбинации DestinationFiles и DestionationFolder не работает, но она захватывает концепцию того, что я хочу сделать:

<CreateItem Include="$(Destination)\**\*.Generated.*.*">
  <Output TaskParameter="Include" ItemName="GeneratedFiles" />
</CreateItem>

<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug-All' Or '%(ConfigurationToBuild.FlavorToBuild)'=='Release-WebService' "
      SourceFiles="@(GeneratedFiles)"
      DestinationFiles="@(GeneratedFiles-&gt;'%(RecursiveDir)%(Filename)%(Extension)')"
      DestinationFolder="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)"
/>

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

В этой сборке я создаю сразу 3 конфигурации: версию Debug-All, версию Release-Client и Release-WebService. Причина заключается в том, чтобы сохранить один и тот же номер сборки и точно такую ​​же кодовую базу, в то время как проекты «Клиент» и «WebService» «публикуются», а затем выбираются проектами установки.

Если я попытаюсь использовать: DestinationFiles = "@ (GeneratedFiles -> '$ (BinariesRoot) \% (ConfigurationToBuild.PlatformToBuild) \% (ConfigurationToBuild.FlavorToBuild) \% (RecursiveDir)% (Filename)% (Extension)')"

MSBuild выдает ошибку в части% (ConfigurationToBuild.FlavorToBuild).

1 Ответ

0 голосов
/ 14 апреля 2009

Я нашел обходной путь для этой проблемы: дублируйте команды вручную. Так что он менее универсален и производит еще больше шума в файле buildlog, но, по крайней мере, работает!

<!-- Copy the updated files to the Binariesroot to have them picked up by the Setups -->
<CreateItem Include="$(Destination)\**\*.Generated.*.sql">
  <Output TaskParameter="Include" ItemName="GeneratedSqlFiles" />
</CreateItem>
<Message Text="GeneratedSqlFiles=@(GeneratedSqlFiles)->RecursiveDir=%(RecursiveDir) Filename=%(Filename)%(Extension)" />

<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
                Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" >
  <Output TaskParameter="Value" PropertyName="RealBinariesRoot" />
</CreateProperty>
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'"
      SourceFiles="@(GeneratedSqlFiles)"
      DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')"
/>
<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'"
            Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" >
  <Output TaskParameter="Value" PropertyName="RealBinariesRoot" />
</CreateProperty>
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'"
      SourceFiles="@(GeneratedSqlFiles)"
      DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')"
/>

Тем временем также обнаруживается, что если у вас есть «.» в пути «Включить» задачи CreateItem свойство RecursiveDir больше не заполняется. Итак, имея

'диск: \ somefolder \ subfolder \ Sources \ Generated ***. Generated. *. Sql' предоставит метаданные% (RecursiveDir). Использование

'диск: \ somefolder \ subfolder \. \ Sources \ Generated ***. Generated. *. Sql', который разрешается по тому же пути, что и выше, NOT предоставит метаданные% (RecursiveDir) , (обратите внимание на тонкое «.» между подпапкой и источниками)

Конечно (закон Мерфи), мы используем это, чтобы указать, с какой ветвью нужно построить, с помощью. указывая на главную ветку; -)

...