MsBuild: Передача ItemGroup с CallTarget - PullRequest
6 голосов
/ 18 июля 2011

У меня возникли некоторые проблемы с областью видимости групп элементов, которые я создаю в скрипте MSBuild.По сути, я хочу иметь две разные цели - давайте назовем их RunUnitTests и RunIntegrationTests - которые генерируют группу элементов с именем TestAssemblies, а затем вызывают RunTests, которая использует TestAssemblies, чтобы определить, какие сборкизапускать тесты из.

Две разные цели для модульных и интеграционных тестов зависят от цели сборки и получают оттуда группу элементов со всеми скомпилированными сборками, но поскольку цель RunTests будет вызываться из разных мест, она может 'на самом деле зависит от любого из них.Таким образом, мне нужно как-то передать группу предметов в общую цель testrunner.Однако это кажется невозможным, потому что изменения в группе предметов в пределах цели, кажется, ограничены для работы только внутри этой цели.

Я видел эти записей , но они только подтверждают мои опасения и предлагают 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>

Есть ли способ обойти это, или мне придется полностью реструктурировать мой скрипт сборки?

Ответы [ 2 ]

14 голосов
/ 18 июля 2011

Изменения в группе предметов в пределах цели видны только для других целей после выхода из изменяющейся цели.Таким образом, чтобы закрепить список тестовых сборок, вам, возможно, придется перенести фактическую настройку целей на собственную цель, как показано ниже:

<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>
2 голосов
/ 18 июля 2011

В задаче «MSBuild» вы можете передавать свойства целевым объектам, но я не уверен, будет ли это работать для ItemGroup.Но вы определенно можете сделать это с помощью пакетной обработки - пропуская одну сборку за раз.

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

Это будет запускать «RunTests» только для одной сборки за раз, поэтому будет бесполезно, если вам нужны знания одругие сборки во время проведения испытаний.Но, возможно, это даст некоторые лучшие идеи, как решить эту проблему ...

...