如何使用msbuild生成specflow feature.cs文件?

时间:2017-02-27 09:19:24

标签: .net visual-studio msbuild bdd specflow

我正在尝试使用带有CI的specflow,并且将生成的.cs文件检查到源代码管理中似乎是错误的。

我已尝试编辑.csproj文件,以便在feature.cs文件的jupyter nbconvert --to python 'example.ipynb' --template=mytemplate.tpl步骤中设置<BeforeBuild>True</BeforeBuild>,但似乎没有任何区别。我可以找到重新生成.feature.cs文件的唯一方法是使用visual studio,但我想在CI构建服务器上使用msbuild。

我还尝试添加一个Compile目标,如specflow doc所述,但也没有创建.feature.cs文件,无论是否有.csproj中的.feature.cs文件文件。

This question建议在MSDN上阅读“指定自定义构建工具”,但我看不到任何有用的内容。schema definition for msbuild on MSDN甚至没有提及AfterUpdateFeatureFilesInProject元素AFAICT。 )

2 个答案:

答案 0 :(得分:1)

您可以在此处找到使用MSBuild生成文件背后代码的文档:http://specflow.org/documentation/Generate-Tests-from-MsBuild/

答案 1 :(得分:1)

我按照说明进行操作 http://specflow.org/documentation/Generate-Tests-from-MsBuild/,但有一些缺失的步骤。

  1. 将SpecFlowTasksPath属性设置为specflow.exe的位置
  2. 导入TechTalk.SpecFlow.tasks
  3. 导入TechTalk.SpecFlow.targets
  4. 这些路径应该是相对路径,我的指向NuGet packages \文件夹,我在那里为我的项目引用SpecFlow。

    另外,我在AfterUpdateFeatureFilesInProject目标中添加了一个步骤,将生成的文件移动到已知位置,以便轻松查看它们。我的GIT存储库中会忽略此文件夹。

      <PropertyGroup>
        <SpecFlowTasksPath>..\packages\SpecFlow.2.2.0\tools\specflow.exe</SpecFlowTasksPath>
      </PropertyGroup>
      <Import Project="..\packages\SpecFlow.2.2.0\tools\TechTalk.SpecFlow.tasks"  Condition="Exists('..\packages\SpecFlow.2.2.0\tools\TechTalk.SpecFlow.tasks')" />
      <Import Project="..\packages\SpecFlow.2.2.0\tools\TechTalk.SpecFlow.targets" Condition="Exists('..\packages\SpecFlow.2.2.0\tools\TechTalk.SpecFlow.targets')" />
      <Target Name="AfterUpdateFeatureFilesInProject">
        <Move SourceFiles="@(SpecFlowGeneratedFiles)" DestinationFolder="Features.Generated" OverwriteReadOnlyFiles="true" />
        <ItemGroup>
          <!-- include any files that specflow generated into the compilation of the project -->
          <Compile Include="Features.Generated\**\*.cs">
            <Visible>true</Visible>
            <!-- the generated files can be hidden in Visual Studio -->
          </Compile>
        </ItemGroup>
      </Target>