Вопрос

Я пытаюсь создать в своем файле 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"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top