将属性组值从一个MsBuild任务传递到另一个任务

时间:2009-09-03 12:37:28

标签: msbuild msbuild-propertygroup

如何在一个构建目标中定义的值在其他目标中保持活动状态?如果PropertyGroup不是我在这里使用的写MsBuild实体,那是什么? ReleaseDir在“Package”目标中打印正常,但在“DoPackage”

中为空
<Target Name="Package">
  <PropertyGroup>
    <ReleasesDir>c:\tmp</ReleasesDirBase>
  </PropertyGroup>
  <Message Text="$(ReleaseDir)"/>
  <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/>
</Target>

<!-- Do the acutal packaging -->
<Target Name="DoPackage">
  <Message Text="Creating package in '$(ReleaseDir)'"/>
  <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/>
  <MakeDir Directories="$(ReleaseDir)"/>
  ...
</Target>

3 个答案:

答案 0 :(得分:21)

well known issue个属性和CallTarget任务。你应该使用DependsOnTargets。

<Target Name="Package">
  <PropertyGroup>
    <ReleasesDir>c:\tmp</ReleasesDir>
  </PropertyGroup>
  <Message Text="$(ReleasesDir)"/>
</Target>

<Target Name="PrePackage" DependsOnTargets="Package">
  <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/>
</Target>

<!-- Do the actual packaging -->
<Target Name="DoPackage" DependsOnTargets="Package">
  <Message Text="Creating package in '$(ReleasesDir)'"/>
  <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/>
  <MakeDir Directories="$(ReleasesDir)"/>
</Target>

答案 1 :(得分:1)

如果想要将属性传递给目标,则MSBuild任务可能很有用。这是使用不同属性值多次调用目标的唯一方法,但它不允许传入项目或项目组。请在Julien链接到的主题中查看此comment

  

... [C]再次对它进行所有MSBuild目标,这次传递了所需的属性。这绕过了增量构建...,但有许多限制,即你不能传入项目,你必须指定需要传递的属性。

以下是使用MSBuild任务的代码片段:

<Target Name="Package">
  <PropertyGroup>
    <ReleasesDir>c:\tmp</ReleasesDir>
  </PropertyGroup>
  <Message Text="$(ReleaseDir)"/>
  <MSBuild Projects="$(MSBuildProjectFile)" Targets="DoPackage" Properties="ReleaseDir=$(ReleaseDir)" /> 
</Target>

<!-- Do the acutal packaging -->
<Target Name="DoPackage">
  <Message Text="Creating package in '$(ReleaseDir)'"/>
  <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/>
  <MakeDir Directories="$(ReleaseDir)"/>
  ...
</Target>

如果要将目标用作子例程,则可以使用此技术,可以使用不同的参数值多次调用。例如,为多个产品配置调用构建过程。

答案 2 :(得分:1)

这可能不是解决此问题最简洁的方法,但如果有人仍想在构建文件中使用 CallTarget ,他/她必须在另一个Target中定义PropertyGroup,以下是解决这个奇怪的问题。

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp">
  <CallTarget Targets="CompileSolution"/>
</Target>
<Target Name="DebugBuildProp">
  <PropertyGroup>
    <Configuration>Debug</Configuration>
  </PropertyGroup>
</Target>
<Target Name="CompileSolution">
   <Message Text="$(Configuration)" />
</Target>