66

我正在尝试在我的 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

4 回答 4

83

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

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

<Target Name="Deploy">
    <!-- Use the Environment property -->
</Target>

然而,一个常见的场景是使用不同的参数多次调用一个目标(即部署多个网站)。在这种情况下,我使用 MSBuildMSBuild任务并将参数作为属性发送:

<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 脚本的完整路径,以防您不想将“部署”发送到另一个文件。

希望这可以帮助!

于 2009-10-01T17:49:18.773 回答
24

你可以用一个目标“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 生成的项目文件中随处找到这种模式。

于 2011-04-22T16:41:41.920 回答
0

在 MSBuild 中可能有更好的方法来执行此操作,但在 Ant 中,我将使用全局属性将信息从一个任务传递到下一个任务。这是一个糟糕的解决方案,但当时我没有看到更好的方法。您应该能够在 MSBuild 中执行此操作,但请记住,您将需要使用该CreateProperty任务来动态分配属性。

另一方面,在 C#(或 VB 或其他)中实现任务非常容易。也许这对你来说是一个更好的解决方案。

于 2009-10-01T07:54:01.337 回答
0
    <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"/>
于 2010-01-07T01:36:38.873 回答