MsBuild: Передача ItemGroup с CallTarget
У меня возникли некоторые проблемы с областью видимости групп элементов, которые я создаю в скрипте 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 ответа
Изменения в группе предметов в пределах цели видны другим целям только после выхода из изменяющейся цели. Таким образом, чтобы закрепить список тестовых сборок, вам, возможно, придется перенести фактическую настройку целей на свою собственную цель, как показано ниже:
<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>
В задаче "MSBuild" вы можете передавать свойства целевым объектам, но я не уверен, будет ли это работать для ItemGroup. Но вы определенно можете сделать это путем пакетной обработки - пропуская одну сборку за раз.
<Target Name="RunUnitTests">
<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="RunTests" Properties="TestAssemblies=%(TestAssemblies.Identity)"/>
</Target>
Он будет запускать "RunTests" только для одной сборки за раз, поэтому он будет бесполезен, если вам понадобятся знания других сборок во время выполнения тестов. Но, возможно, это даст некоторые лучшие идеи, как решить эту проблему...