MSBuild将参数传递给CallTarget

Aar*_*ell 63 msbuild parameter-passing msbuild-target

我正在尝试在我的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>
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何允许参数传递到CallTarget,然后依次传递给Target自己.

小智 76

MSBuild目标不是为接收参数而设计的.相反,它们使用您为它们定义的属性.

<PropertyGroup>
    <Environment>myValue</Environment>
</PropertyGroup>

<Target Name="Deploy">
    <!-- Use the Environment property -->
</Target>
Run Code Online (Sandbox Code Playgroud)

但是,常见的情况是使用不同的参数多次调用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>
Run Code Online (Sandbox Code Playgroud)

$(MSBuildProjectFullPath) 是您不希望将"部署"发送到另一个文件的当前MSBuild脚本的完整路径.

希望这可以帮助!


Geo*_*voy 19

你可以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>
Run Code Online (Sandbox Code Playgroud)

使用项目组作为@(What)目标内的标量值可以实现技巧,并%(How)引用foreach项目中的元数据元素.

这是在msbuild中执行操作的一种自然方式,例如,您可以在使用Visual Studio生成的项目文件中的任何位置找到此模式.