使用MSBuild将输出项目传递给单独的目标

时间:2012-02-13 23:32:13

标签: msbuild fxcop msbuild-4.0 msbuildcommunitytasks

我正在创建一个buildscript,我正在输出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)\Xml\FxCopReport.xsl"
      ApplyOutXsl="True"
      FailOnError="False" />
</Target>

当我运行它时,在FxCopyReport目标中,TargetDLL的消息为空,而如果我把它放在Build目标中,它会填充。

如何传递/引用此值?

2 个答案:

答案 0 :(得分:0)

Sayed Ibrahim Hashimi(Inside MSBuild一书的合着者)有一个blog post,描述了你遇到的问题,可追溯到2005年。基本上CallTarget任务表现得很奇怪。我不确定它是否是错误或设计行为,但MSBuild 4.0中的行为仍然相同。

作为一种解决方法,使用正常的MSBuild机制,使用属性DependsOnTargets,BeforeTargets或AfterTargets设置MSBuild中目标的执行顺序。

答案 1 :(得分:0)

我能够解决这个问题。

基本上,在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)\Xml\FxCopReport.xsl"
      Rules="$(FxCopExcludeRules)"
      ApplyOutXsl="True"
      FailOnError="True" />
    <Message Text="##teamcity[importData id='FxCop' file='$(BuildPath)\$(FxCopReportFile)']" Condition="'$(TEAMCITY_BUILD_PROPERTIES_FILE)' != ''" />
  </Target>