我可以使用DTE.Project添加msbuild导入元素吗?

时间:2010-06-30 21:25:52

标签: visual-studio msbuild automation

我正在开发一个用于处理新测试类型的VS插件。我们要做的其中一件事是,当我们的一个测试在测试项目中时,将MSBuild导入添加到项目文件中,以运行我们的自定义构建任务。

我可以使用Microsoft.Build.BuildEngine.Project.Imports添加import元素,但是如果我通过BuildEngine对象保存项目文件,我会收到“文件已在Visual Studio外部修改”警告。将新的Imports添加到Project.Imports集合似乎并没有在Visual Studio中将项目标记为脏,因此我不能依赖VS来正常保存文件。

有什么办法可以通过DTE.Project或VSLangProj.Project对象访问这部分MSBuild功能吗?

感谢。

1 个答案:

答案 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)" />
    ...