Параметры передачи MSBuild в CallTarget
Я пытаюсь сделать повторно используемую цель в моем файле 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
.
Ответы
Ответ 1
Цели MSBuild не предназначены для получения параметров. Вместо этого они используют свойства, которые вы им определяете.
<PropertyGroup>
<Environment>myValue</Environment>
</PropertyGroup>
<Target Name="Deploy">
<!-- Use the Environment property -->
</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 script, если вы не хотите отправлять "Deploy" в другой файл.
Надеюсь, это поможет!
Ответ 2
Вы можете "вывести" по 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.
Ответ 3
В MSBuild может быть лучший способ сделать это, но в Ant я бы использовал глобальные свойства для переноса информации из одной задачи в другую. Это было паршивое решение, но в то время я не видел лучшего способа. Вы должны иметь возможность сделать это в MSBuild, но имейте в виду, что вам нужно будет использовать задачу CreateProperty
для динамического назначения свойства.
С другой стороны, довольно легко реализовать задачи на С# (или VB или что-то еще). Возможно, это лучшее решение для вас.
Ответ 4
<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"/>