MSBuild передает параметры в CallTarget
-
19-09-2019 - |
Вопрос
Я пытаюсь создать в своем файле MSBuild цель многократного использования, чтобы можно было вызывать ее несколько раз с разными параметрами.
У меня есть вот такой скелет:
<Target Name="Deploy">
<!-- Deploy to a different location depending on parameters -->
</Target>
<Target Name="DoDeployments">
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to dev -->
</CallTarget>
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to testing -->
</CallTarget>
</Target>
Но я не могу понять, как разрешить передачу параметров в CallTarget
, а затем, в свою очередь, Target
сам.
Решение
Целевые объекты MSBuild не предназначены для получения параметров.Вместо этого они используют свойства, которые вы для них определяете.
<PropertyGroup>
<Environment>myValue</Environment>
</PropertyGroup>
<Target Name="Deploy">
<!-- Use the Environment property -->
</Target>
Однако обычным сценарием является вызов Target несколько раз с разными параметрами (т. е.Развернуть несколько веб-сайтов).В этом случае я использую MSBuild MSBuild
задачу и отправьте параметры как Свойства:
<Target Name="DoDeployments">
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)"
Targets="Deploy" />
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)"
Targets="Deploy" />
</Target>
$(MSBuildProjectFullPath)
— это полный путь к текущему сценарию MSBuild на случай, если вы не хотите отправлять «Развертывание» в другой файл.
Надеюсь это поможет!
Другие советы
Вы можете выполнить foreach над ItemGroup
с целью, только делать это нужно декларативно.Вы даже можете иметь дополнительные метаданные в элементах, как в примере кода:
<ItemGroup>
<What Include="Dev">
<How>With bugs</How>
</What>
<What Include="Test">
<How>With tests</How>
</What>
<What Include="Chicken">
<How>Deep fried</How>
</What>
</ItemGroup>
<Target Name="Deploy">
<Message Text="@(What), %(How)" />
</Target>
Использование группы элементов в качестве скалярного значения @(What)
внутри цели делает свое дело, и %(How)
ссылается на элемент метаданных в элементе foreach.
Это естественный способ работы в msbuild, например, вы можете найти этот шаблон повсюду в файлах проекта, созданных с помощью Visual Studio.
Возможно, в MSBuild это можно сделать получше, но в Ant я бы использовал глобальные свойства для переноса информации от одной задачи к другой.Это было паршивое решение, но в то время я не видел лучшего пути.Вы сможете сделать это в MSBuild, но имейте в виду, что вам нужно будет использовать CreateProperty
Задача динамического назначения свойства.
С другой стороны, реализовать задачи на C# (или VB, или чем-то еще) довольно легко.Возможно, это лучшее решение для вас.
<CreateProperty
Value="file1">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<CallTarget Targets="Deploy"/>
<Message Text="$(filename)"/>
<CreateProperty
Value="file2">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<Message Text="$(filename)"/>
<CallTarget Targets="Deploy"/>