MSBuild:添加其他文件进行编译而不更改项目文件

时间:2010-06-12 20:43:26

标签: msbuild specflow

环顾四周后,我找不到这个问题的简单答案。

我正在尝试创建一个MSBuild文件,以便我在Visual Studio 2010 express中轻松使用SpecFlow和NUnit。

下面的文件不完整,这只是一个概念验证,需要更加通用。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <BuildDependsOn>
            BuildSolution;          
            SpecFlow;
            BuildProject;           
            NUnit;
        </BuildDependsOn>
    </PropertyGroup>

    <PropertyGroup>
        <Solution>C:\Users\Craig\Documents\My Dropbox\Cells\Cells.sln</Solution>
        <CSProject>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\Configuration.csproj</CSProject>
        <DLL>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\bin\Debug\Configuration.dll</DLL>
        <CSFile>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\SpecFlowFeature1.feature.cs</CSFile>
    </PropertyGroup>

    <Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
        <Message Text="Build Started" Importance="high" />
        <Message Text="Build Ended" Importance="high" />
    </Target>

    <Target Name="BuildSolution">
        <Message Text="BuildSolution Started" Importance="high" />
            <MSBuild Projects="$(Solution)" Properties="Configuration=Debug" />
        <Message Text="BuildSolution Ended" Importance="high" />
    </Target>

    <Target Name="SpecFlow">
        <Message Text="SpecFlow Started" Importance="high" />
            <Exec Command='SpecFlow generateall "$(CSProject)"' />
        <Message Text="SpecFlow Ended" Importance="high" />
    </Target>

    <Target Name="BuildProject">
        <Message Text="BuildProject Started" Importance="high" />
            <MSBuild Projects="$(CSProject)" Properties="Configuration=Debug" />
        <Message Text="BuildProject Ended" Importance="high" />
    </Target>

    <Target Name="NUnit">
        <Message Text="NUnit Started" Importance="high" />
            <Exec Command='NUnit /run "$(DLL)"' />
        <Message Text="NUnit Ended" Importance="high" />
    </Target>
</Project>

SpecFlow任务查找.csproj文件并创建SpecFlowFeature1.feature.cs。 我需要在构建.csproj时包含此文件,以便NUnit可以使用它。

我知道我可以修改(直接或复制).csproj文件以包含生成的文件,但我更愿意避免这种情况。

我的问题是:有没有办法使用MSBuild任务来构建项目文件,并告诉它包含一个要包含在构建中的附加文件?

谢谢。

2 个答案:

答案 0 :(得分:3)

如果没有编辑项目文件,我发现无法做到这一点。

所以我创建了一个MSBuild文件:

  • 复制项目文件
  • 通过SpecFlow
  • 运行副本
  • 将新的.cs文件添加到复制的项目
  • 编译项​​目
  • 调试通过NUnit
  • 运行每个已编译的DLL
  • 清理 - 删除已复制的项目

我在这里发表了关于如何使用它的博客:

http://learntdd.wordpress.com/2010/06/10/using-specflow-and-nunit-on-visual-studio-2010-express/

(这是版本1,我想改进脚本)

答案 1 :(得分:1)

如果没有对.csproj文件进行任何修改,我想不出任何方法。

我建议的方法看起来像这样。

在你的.csproj中Import一个容器目标文件

...
<Import Project="SpecFlow.target" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
...

就在CSharp.targets之上。

Specflow.targets看起来像这样

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Compile Include="@(Compile)" />
    </ItemGroup>
</Project>

因此从VS构建项目时不会造成伤害。

然后,您可以使用 SpecFlow Exec的输出并将其添加到SpecFlow.targets文件

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Compile Include="@(Compile)" />
        <Compile Include="SpecFlowFeature1.feature.cs" />
    </ItemGroup>
</Project>

...

并在构建.csproj之后清理SpecFlow.targets。