我正在开发一个用于处理新测试类型的VS插件。我们要做的其中一件事是,当我们的一个测试在测试项目中时,将MSBuild导入添加到项目文件中,以运行我们的自定义构建任务。
我可以使用Microsoft.Build.BuildEngine.Project.Imports添加import元素,但是如果我通过BuildEngine对象保存项目文件,我会收到“文件已在Visual Studio外部修改”警告。将新的Imports添加到Project.Imports集合似乎并没有在Visual Studio中将项目标记为脏,因此我不能依赖VS来正常保存文件。
有什么办法可以通过DTE.Project或VSLangProj.Project对象访问这部分MSBuild功能吗?
感谢。
答案 0 :(得分:0)
我建议您在.csproj中添加一个固定的导入,并在.targets内部决定是否执行测试:
您的.csproj
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="CustomTest.targets" Condition="Exists('CustomTest.targets')" />
请注意Condition
以检查.targets是否可用。
您的CustomTest.targets
通过设置相应的条件来确定要运行的测试。
<Project DefaultTargets="RunTests" xmlns="...">
<ItemGroup>
<MyCustomTests Include="Test_A" Condition="Exists('Test_A.cs')" />
<MyCustomTests Include="Test_B" Condition="Exists('Test_B.cs')" />
</ItemGroup>
<Target Name="RunTests" Condition="@(MyCustomTests)!=''">
<Message Text="Running Test %(MyCustomTests.Identity)" />
</Target>
</Project>
您甚至可以使用运行测试时可能需要的元数据来扩展MyCustomTests项目:
...
<ItemGroup>
<MyCustomTests Include="Test_A" Condition="Exists('Test_A.cs')">
<TestType>Boundary</TestType>
</MyCustomTests>
<MyCustomTests Include="Test_B" Condition="Exists('Test_B.cs')">
<TestType>SQLInjection</TestType>
</MyCustomTests>
</ItemGroup>
...
<Message Text="Running %(MyCustomTests.TestType) Test %(MyCustomTests.Identity)" />
...