如何在一个构建目标中定义的值在其他目标中保持活动状态?如果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>
答案 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>