【问题标题】:Is it possible to refer to metadata of the target from within the target implementation in MSBuild?是否可以从 MSBuild 的目标实现中引用目标的元数据?
【发布时间】:2009-12-13 16:08:18
【问题描述】:

我的 msbuild 目标文件包含以下部分:

<ItemGroup>
  <Targets Include="T1">
    <Project>A\B.sln"</Project>
    <DependsOnTargets>The targets T1 depends on</DependsOnTargets>
  </Targets>
  <Targets Include="T2">
    <Project>C\D.csproj"</Project>
    <DependsOnTargets>The targets T2 depends on</DependsOnTargets>
  </Targets>
  ...
</ItemGroup>
<Target Name="T1" DependsOnTargets="The targets T1 depends on">
  <MSBuild Projects="A\B.sln" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="T2" DependsOnTargets="The targets T2 depends on">
  <MSBuild Projects="C\D.csproj" Properties="Configuration=$(Configuration)" />
</Target>

如你所见,A\B.sln 出现了两次:

  1. 作为T1ItemGroup 部分中的Project 元数据。
  2. Target 语句本身中传递给MSBuild 任务。

我想知道是否可以删除第二个实例并将其替换为对目标的Project 元数据的引用,Target 任务的名称是什么?

(Targets.DependsOnTargets) 元数据提出了完全相同的问题。它被提及两次,很像 %(Targets.Project) 元数据。

谢谢。

编辑:

我可能应该描述解决方案必须满足的约束:

  1. 我希望能够轻松构建单个项目。今天我可以简单地执行msbuild file.proj /t:T1 来构建T1 目标,我希望保留这个能力。
  2. 我想强调的是,有些项目依赖于其他项目,所以DependsOnTargets 属性对他们来说是非常必要的。

【问题讨论】:

    标签: msbuild metadata


    【解决方案1】:

    目标名称必须是固定值,所以你在这里的东西是行不通的。

    另外我建议不要在 DependsOnTargets 表达式中使用 Batching Expressions。如果您不完全了解正在发生的事情,这可能会导致奇怪的行为。

    在您的情况下,您可以只创建一个“驱动程序”目标,该目标使用这些项目来执行构建。唯一困难的部分是您尝试执行的 DependsOnTargets。我不确定您正在尝试做什么的详细信息,因此无法提出任何建议,但至于其他请看一下创建类似的目标。

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
        <Targets Include="T1">
          <Project>A\B.sln"</Project>
          <DependsOnTargets>The targets T1 depends on</DependsOnTargets>
        </Targets>  <Targets Include="T2">
          <Project>C\D.csproj"</Project>
          <DependsOnTargets>The targets T2 depends on</DependsOnTargets>
        </Targets>  ...
      </ItemGroup>
    
      <Target Name="Build">
        <!-- 
        This will be executed once for every unique value of Project in the 
        Target item group 
        -->
        <MSBuild Projects="%(Targets.Project)"
                 Properties="Configuration=$(Configuration)"
      </Target> 
    </Project>
    

    【讨论】:

    • 您好,感谢您的及时回复。我已经修改了我的问题以澄清一些问题。顺便说一句,我已经在使用您为 clean 目标建议的结构,因为我通常会清理所有项目。但是我需要构建单个项目的能力,我看不出你的解决方案是如何让我这样做的,更不用说它忽略依赖关系了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多