【问题标题】:MSBuild passing parameters to CallTargetMSBuild 将参数传递给 CallTarget
【发布时间】:2010-12-02 21:51:39
【问题描述】:

我正在尝试在我的 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 parameter-passing msbuild-target


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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
            <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"/>
        

        【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 2012-08-09
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 2016-08-13
          • 1970-01-01
          相关资源
          最近更新 更多