【问题标题】:MsBuild: Passing an ItemGroup with CallTargetMsBuild:使用 CallTarget 传递 ItemGroup
【发布时间】:2011-10-07 12:37:09
【问题描述】:

我在 MSBuild 脚本中创建的项目组的范围界定方面遇到了一些问题。基本上,我想做的是有两个不同的目标——我们称它们为RunUnitTestsRunIntegrationTests——生成一个名为TestAssemblies 的项目组,然后调用RunTests,它使用TestAssemblies 来确定哪些程序集从中运行测试。

单元测试和集成测试的两个不同目标都依赖于构建目标,并从那里获得一个包含所有已编译程序集的项目组,但由于 RunTests 目标将从不同的地方调用,它不能真正依赖在其中任何一个上。因此,我需要以某种方式将项目组传递给 common testrunner 目标。但是,这似乎是不可能的,因为对目标中的项目组的更改似乎仅限于在该目标中起作用。

我见过theseposts,但他们似乎只是证实了我的恐惧,并建议将DependsOnTarget 作为一种解决方法——这对我不起作用,因为我需要从不同的地方获取物品在不同的运行中。

这是我目前所拥有的:

<Target Name="RunAllTests" DependsOnTarget="BuildProject">
    <!-- In here, items created in BuildProject are available. -->
    <CallTarget Targets="RunUnitTests;RunIntegrationTests">
</Target>

<Target Name="RunUnitTests" DependsOnTarget="BuildProject">
    <!-- In here, items created in BuildProject are available. -->
    <!-- One of those is @(UnitTestAssemblies) -->

    <CreateItem Include="@(UnitTestAssemblies)">
        <Output TaskParameter="Include" ItemName="TestAssemblies" />
    </CreateItem>

    <CallTarget Targets="RunTests" />
</Target>

<!-- Then there's a similar target named RunIntegrationTests, which does the
     same as RunUnitTests except it includes @(IntegrationTestAssemblies) -->

<Target Name="RunTests">
    <!-- Here, I'd like to access @(TestAssemblies) and pass them to the NUnit
         task, but they have fallen out of scope. -->
</Target>

有什么办法可以解决这个问题,还是我必须完全重组我的构建脚本?

【问题讨论】:

  • @Thomas Gerstendörfer:请使用我当前构建脚本的简化版本查看我的更新。

标签: msbuild scope itemgroup


【解决方案1】:

在目标中对项目组的更改仅在更改目标退出后对其他目标可见。因此,要获得要粘贴的测试程序集列表,您可能必须将目标实际设置为自己的目标,如下所示:

<Target Name="PrepareUnitTestList" DependsOnTarget="BuildProject">
  <ItemGroup>
    <TestAssemblies Include="@(UnitTestAssemblies)"/>
  </ItemGroup>
</Target>

<Target Name="RunUnitTests" DependsOnTargets="PrepareUnitTestList">
  <CallTarget Targets="RunTests"/>
</Target>

<Target Name="RunTests">
  <Message Text="Test: %(TestAssemblies.Identity)"/>
</Target>

【讨论】:

  • 通过一点重组,我能够以这种方式解决问题。谢谢!
  • 也许你可以通过重组来改进这个答案......我很确定 RunTests 被调用一次,并且 Message 被每个 TestAssembly 调用一次。
【解决方案2】:

在“MSBuild”任务中,您可以将属性传递给目标,但我不确定它是否适用于 ItemGroup。但是您绝对可以通过批处理来完成 - 一次传递一个程序集。

<Target Name="RunUnitTests">
  <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="RunTests" Properties="TestAssemblies=%(TestAssemblies.Identity)"/>
</Target>

它一次只会为一个程序集运行“RunTests”,因此如果您在运行测试时需要了解其他程序集,它将毫无用处。但也许它会提供一些更好的想法来解决这个问题......

【讨论】:

  • 我考虑了这一点,但也意识到我希望整个收集测试结果,而不仅仅是每个组件,所以这不是一个选项。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2012-10-12
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多