我正在创建一个构建脚本,输出MSBuild的TargetOutputs,然后希望在单独的目标中调用FXCop,并在TargetAssemblies中使用这些输出。
<Target Name="Build">
<MSBuild Projects="@(Projects)"
Properties="Platform=$(Platform);Configuration=$(Configuration);"
Targets="Build"
ContinueOnError="false">
<Output TaskParameter="TargetOutputs" ItemName="TargetDLLs"/>
</MSBuild>
<CallTarget Targets="FxCopReport" />
</Target>
<Target Name="FxCopyReport">
<Message Text="FXCop assemblies to test: @(TargetDLLs)" />
<FxCop
ToolPath="$(FXCopToolPath)"
RuleLibraries="@(FxCopRuleAssemblies)"
AnalysisReportFileName="FXCopReport.html"
TargetAssemblies="@(TargetDLLs)"
OutputXslFileName="$(FXCopToolPath)XmlFxCopReport.xsl"
ApplyOutXsl="True"
FailOnError="False" />
</Target>
当我运行它时,在FxCopyReport目标中,TargetDLL的Message为空,而如果我将它放在Build目标中,它就会填充。
如何传递/引用此值?
Sayed Ibrahim Hashimi(《内部MSBuild》一书的合著者)有一篇博客文章,描述了你在2005年遇到的问题。从本质上讲,CallTarget任务的行为很奇怪。我不确定这是一个bug还是设计的行为,但在MSBuild4.0中的行为仍然相同。
作为一种解决方法,请使用正常的MSBuild机制,即使用属性DependsOnTargets、BeforeTargets或AfterTargets来设置MSBuild中目标的执行顺序。
我能够弄清楚这一点。
从本质上讲,在MSBuild步骤之后,我创建了一个ItemGroup,然后在调用Target中引用它。
<Target Name="Build">
<Message Text="Building Solution Projects: %(Projects.FullPath)" />
<MSBuild Projects="@(Projects)"
Properties="Platform=$(Platform);Configuration=$(Configuration);"
Targets="Build"
ContinueOnError="false">
<Output TaskParameter="TargetOutputs" ItemName="TargetDllOutputs"/>
</MSBuild>
<ItemGroup>
<TestAssemblies Include="@(TargetDllOutputs)" />
</ItemGroup>
</Target>
<Target Name="FXCopReport">
<Message Text="FXCop assemblies to test: @(TestAssemblies)" />
<FxCop
ToolPath="$(FXCopToolPath)"
RuleLibraries="@(FxCopRuleAssemblies)"
AnalysisReportFileName="$(BuildPath)$(FxCopReportFile)"
TargetAssemblies="@(TestAssemblies)"
OutputXslFileName="$(FXCopToolPath)XmlFxCopReport.xsl"
Rules="$(FxCopExcludeRules)"
ApplyOutXsl="True"
FailOnError="True" />
<Message Text="##teamcity[importData id='FxCop' file='$(BuildPath)$(FxCopReportFile)']" Condition="'$(TEAMCITY_BUILD_PROPERTIES_FILE)' != ''" />
</Target>