MSBuild передает параметры в CallTarget - PullRequest
62 голосов
/ 01 октября 2009

Я пытаюсь создать цель многократного использования в моем файле 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.

Ответы [ 4 ]

74 голосов
/ 01 октября 2009

Цели 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, если вы не хотите отправлять «Deploy» в другой файл.

Надеюсь, это поможет!

19 голосов
/ 22 апреля 2011

Вы можете «предвидеть» более чем 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.

0 голосов
/ 07 января 2010
    <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"/>
0 голосов
/ 01 октября 2009

Возможно, есть лучший способ сделать это в MSBuild, но в Ant я бы использовал глобальные свойства для переноса информации из одной задачи в другую. Это было паршивое решение, но я не видел лучшего способа в то время. Вы должны быть в состоянии сделать это в MSBuild, но имейте в виду, что вам нужно будет использовать задачу CreateProperty для динамического назначения свойства.

С другой стороны, довольно легко реализовать задачи в C # (или VB или что-то еще). Может быть, это лучшее решение для вас.

...