是否可以在MSBuild中的目标实现中引用目标的元数据?

时间:2009-12-13 16:08:18

标签: msbuild metadata

我的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. Project部分中T1的{​​{1}}元数据。
  2. 在传递给ItemGroup任务的Target语句中。
  3. 我想知道我是否可以删除第二个实例并将其替换为对目标的MSBuild元数据的引用,该名称是否赋予Project任务?

    要求Target元数据完全相同的问题。它被提及两次,就像(Targets.DependsOnTargets)元数据一样。

    感谢。

    修改

    我应该描述约束,解决方案必须满足这些约束:

    1. 我希望能够轻松地构建单个项目。今天我可以简单地执行%(Targets.Project)来构建T1目标,我希望保持这种能力。
    2. 我想强调一些项目依赖于其他项目,因此msbuild file.proj /t:T1属性对他们来说确实是必要的。

1 个答案:

答案 0 :(得分:0)

目标名称必须是固定值,因此您所拥有的内容不起作用。

另外,我建议不要在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>