Подтвердить что ты не робот

Параметры передачи 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.

4b9b3361

Ответ 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"/>