Visual studio 2017 SpecFlow/MSBuild Codebehind Gen-生成所有任务

Visual studio 2017 SpecFlow/MSBuild Codebehind Gen-生成所有任务,visual-studio-2017,teamcity,specflow,msbuild-task,Visual Studio 2017,Teamcity,Specflow,Msbuild Task,在我正在从事的一个项目中,我正在维护一些用SpecFlow编写的特性测试。我们的团队大约在一年前开始使用Visual Studio 2017,我们终于开始对测试进行维护 我正在进行的项目的测试最初是在SpecFlow 2.3.2中编写的,最后一次更新是在Visual Studio 2015中 众所周知,SpecFlowSingleFileGenerator在VS 2017上不起作用,因此我昨天花了大部分时间来更改套件,改为使用MSBuildSingleFileGenerator,如中所述 问题:

在我正在从事的一个项目中,我正在维护一些用SpecFlow编写的特性测试。我们的团队大约在一年前开始使用Visual Studio 2017,我们终于开始对测试进行维护

我正在进行的项目的测试最初是在SpecFlow 2.3.2中编写的,最后一次更新是在Visual Studio 2015中

众所周知,
SpecFlowSingleFileGenerator
在VS 2017上不起作用,因此我昨天花了大部分时间来更改套件,改为使用
MSBuildSingleFileGenerator
,如中所述

问题:
在本地,我可以构建我的解决方案,包括特性测试项目。 但是,当我尝试在构建服务器上构建项目时,我不断遇到以下错误:

[exec]  C:\CheckoutDirectory\My Awesome Project\packages\SpecFlow.Tools.MsBuild.Generation.2.3.2\build\SpecFlow.Tools.MsBuild.Generation.targets(45,5): 
error MSB4036: The "GenerateAll" task was not found. 
Check the following: 
  1.) The name of the task in the project file is the same as the name of the task class. 
  2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 
  3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin" directory. [C:\CheckoutDirectory\My Awesome Project\AwesomeProject.FeatureTest\AwesomeProject.FeatureTest.csproj]

因为我已经确认这是复制到构建服务器的,所以情况更加神秘。看起来NuGet包正在被忠实地拉下来。因此,我无法理解为什么我的本地副本的行为与生成服务器上的副本不同。

我不确定您在何处找到此语句:

已知SpecFlowSingleFileGenerator不适用于VS 2017

SpecFlowSingleFileGenerator在VS2015、VS2017和VS2019中工作。我们将其视为一项传统功能,但它仍然存在。由于某些星期,它在默认情况下被禁用,但您可以在选项中启用它

它适用于SpecFlow>=2.3.2和2.4。对于SpecFlow 3,必须使用MSBuild集成。旧版本的SpecFlow存在一些问题,但使用它们也可以工作。这取决于你的设置


关于您的MSBuild错误:

SpecFlow<3.0的MSBuild任务位于SpecFlow.exe中。它在您的构建服务器上吗? 它是
SpecFlow
NuGet包的一部分。如果MSBuild找不到任务所在的程序集,通常会出现此类错误

对于MSBuild的“调试”问题,我强烈建议使用MSBuild结构化日志查看器()。有了它,就可以很容易地看到构建中发生了什么

这里有一个使用SpecFlow 2.3.2生成MSBuild代码的示例:

您可以将您的项目与此示例进行比较



完全披露:我是SpecFlow的维护者之一。

我不确定你在哪里找到了这句话:

已知SpecFlowSingleFileGenerator不适用于VS 2017

SpecFlowSingleFileGenerator在VS2015、VS2017和VS2019中工作。我们将其视为一项传统功能,但它仍然存在。由于某些星期,它在默认情况下被禁用,但您可以在选项中启用它

它适用于SpecFlow>=2.3.2和2.4。对于SpecFlow 3,必须使用MSBuild集成。旧版本的SpecFlow存在一些问题,但使用它们也可以工作。这取决于你的设置


关于您的MSBuild错误:

SpecFlow<3.0的MSBuild任务位于SpecFlow.exe中。它在您的构建服务器上吗? 它是
SpecFlow
NuGet包的一部分。如果MSBuild找不到任务所在的程序集,通常会出现此类错误

对于MSBuild的“调试”问题,我强烈建议使用MSBuild结构化日志查看器()。有了它,就可以很容易地看到构建中发生了什么

这里有一个使用SpecFlow 2.3.2生成MSBuild代码的示例:

您可以将您的项目与此示例进行比较



全面披露:我是SpecFlow的维护者之一。

如果可能的话,听起来是升级到SpecFlow 3的好时机。它使用MSBuild生成代码隐藏文件.Greg-这是我想做的一部分。然而,使现有的SpecFlow测试与VS2017兼容的事实已经严重破坏了我们的构建,这是一种阻碍……嗯,很多事情。在我敢考虑升级之前,我需要控制这种伤害。我不确定你有什么问题。我们在VS2017中使用SpecFlow 2.4已有几年了,没有任何问题。我已经在Jenkins和Azure DevOps中运行了运行SpecFlow测试的构建。我们使用MS测试框架。如果可能的话,听起来是升级到SpecFlow 3的好时机。它使用MSBuild生成代码隐藏文件.Greg-这是我想做的一部分。然而,使现有的SpecFlow测试与VS2017兼容的事实已经严重破坏了我们的构建,这是一种阻碍……嗯,很多事情。在我敢考虑升级之前,我需要控制这种伤害。我不确定你有什么问题。我们在VS2017中使用SpecFlow 2.4已有几年了,没有任何问题。我已经在Jenkins和Azure DevOps中运行了运行SpecFlow测试的构建。我们使用MS测试框架。Andreas-首先,感谢您的回答。最后,为了让工作正常进行,使我的团队不会被阻止,我最终回滚了所有更改,并完全删除了
MsBuildSingleFileGenerator
。不使用它会更快。因为时间是一个因素——正如我在问题中提到的那样——计划是在稍后的日期重新升级SpecFlow版本和文件生成器,当我们有时间正确理解正在发生的事情时。此外,我在哪里得到了“SpecFlow单文件生成器在VS2017中不起作用”事情是这样的——每当我试图通过Visual Studio强制重新生成所有功能文件codebehind时,我的VS 2017安装都会抛出错误。项目本身没有改变,所以它似乎是一个兼容性问题。所以,我接受了你的答案。事实证明,为了让测试功能文件重新生成,我只需要打开遗留工具。我们仍然需要对MsBuild进行技术升级,但至少现在我还没有死在水里。谢谢你的发帖。很高兴知道你现在是unst
<Target Name="UpdateFeatureFilesInProject"  
        DependsOnTargets="BeforeUpdateFeatureFilesInProject"  
        Inputs="@(SpecFlowFeatureFiles)" Outputs="@(SpecFlowFeatureFiles->'%(RelativeDir)\%(Filename).feature.cs')">
  <GenerateAll
    ShowTrace="$(ShowTrace)"

    BuildServerMode="$(BuildServerMode)"
    OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"

    ProjectPath="$(MSBuildProjectFullPath)"
    ForceGeneration="$(ForceGeneration)"
    VerboseOutput="$(VerboseOutput)"
    DebugTask="$(SpecFlow_DebugMSBuildTask)" 
    >
    <Output TaskParameter="GeneratedFiles" ItemName="SpecFlowGeneratedFiles" />
  </GenerateAll>
</Target>