2

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

我正在尝试创建一个 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 任务来构建项目文件并告诉它包含一个附加文件以包含在构建中?

谢谢你。

4

2 回答 2

3

如果不编辑项目文件,我就无法做到这一点。

所以我制作了一个 MSBuild 文件:

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

我在这里写过关于如何使用它的博客:

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

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

于 2010-06-16T23:14:39.947 回答
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。

于 2010-06-14T18:42:58.553 回答