Передайте выходные элементы в отдельную цель с помощью MSBuild - PullRequest
0 голосов
/ 14 февраля 2012

Я создаю скрипт компоновки, в котором я выводю TargetOutputs MSBuild, затем хочу вызвать 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, Сообщение TargetDLLs пустое, тогда как, если я помещу это в цель Build, оно заполняется.

Как я могу передать / ссылаться на это значение?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Я смог понять это.

По сути, после шага MSBuild я создал ItemGroup, на которую я затем ссылался в вызывающей цели.

<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>
0 голосов
/ 14 февраля 2012

В блоге написано Сайедом Ибрагимом Хашими (соавтором книги Inside MSBuild), описывающим проблему, с которой вы столкнулись в 2005 году. По сути, задача CallTarget ведет себя странно.Я не уверен, является ли это ошибкой или разработанным поведением, но поведение все еще такое же в MSBuild 4.0.

В качестве обходного пути используйте обычный механизм MSBuild для установки порядка выполнения целей в MSBuild, используя атрибуты DependsOnTargets, BeforeTargets или AfterTargets.

...