本文主要是介绍BDD - SpecFlow Troubleshooting:Unable to find plugin in the plugin search path: SpecRun,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
BDD - SpecFlow Troubleshooting:Unable to find plugin in the plugin search path: SpecRun
- 引言
- Issue 描述
- 按顺序排摸检查
- 1. 包是否 Download 到 NuGet packages 文件夹
- 2. 查看中间缓存包
- 3. 项目 \bin\Debug 是否存在 DLL
- 快速解决方案
- 1. 清空依赖包文件夹
- 2. Restore NuGet Packages
- 3. 重新 Build Solution
引言
Visual Studio 项目用到 NuGet 管理项目中有需要的各种依赖包,有时会遇到找不到依赖包的问题,本文通过遇到的 Specflow 问题 “ Unable to find plugin in the plugin search path: SpecRun ”
来进行分析和解决,以后遇到类似的,也可以按同样的方式进行排摸解决。
Issue 描述
创建一个 SpecFlow + SpecRun 项目,NuGet 安装好了 SpecFlow 和 SpecRun 相关依赖包,但是在创建 Feature 文件进行保存时,就会发生异常 Unable to find plugin in the plugin search path: SpecRun
Error: Exception has been thrown by the target of an invocation. -> Unable to find plugin in the plugin search path: SpecRun. Please check http://go.specflow.org/doc-plugins for details.
Exception: System.Reflection.TargetInvocationException->TechTalk.SpecFlow.SpecFlowException
StackTrace:at TechTalk.SpecFlow.Generator.Plugins.GeneratorPluginLocator.LocatePluginAssembly(PluginDescriptor pluginDescriptor)at TechTalk.SpecFlow.Generator.Plugins.GeneratorPluginLoader.LoadPlugin(PluginDescriptor pluginDescriptor)at TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.LoadPlugin(PluginDescriptor pluginDescriptor, IGeneratorPluginLoader pluginLoader, GeneratorPluginEvents generatorPluginEvents)at TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.LoadPlugins(ObjectContainer container, IGeneratorConfigurationProvider configurationProvider, SpecFlowConfigurationHolder configurationHolder, GeneratorPluginEvents generatorPluginEvents, SpecFlowProjectConfiguration specFlowConfiguration)at TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.CreateContainer(SpecFlowConfigurationHolder configurationHolder, ProjectSettings projectSettings)at TechTalk.SpecFlow.Generator.TestGeneratorFactory.CreateGenerator(ProjectSettings projectSettings)at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)at SpecFlow.VisualStudio.SpecFlowConnector.ReflectionExtensions.ReflectionCallMethod[T](Object obj, String methodName, Type[] parameterTypes, Object[] args) in D:\a\1\s\Connectors\SpecFlow.VisualStudio.SpecFlowConnector\ReflectionExtensions.cs:line 27at SpecFlow.VisualStudio.SpecFlowConnector.ReflectionExtensions.ReflectionCallMethod[T](Object obj, String methodName, Object[] args) in D:\a\1\s\Connectors\SpecFlow.VisualStudio.SpecFlowConnector\ReflectionExtensions.cs:line 8at SpecFlow.VisualStudio.SpecFlowConnector.Generation.BaseGenerator.Generate(String projectFolder, String configFilePath, String targetExtension, String featureFilePath, String targetNamespace, String projectDefaultNamespace, Boolean saveResultToFile) in D:\a\1\s\Connectors\SpecFlow.VisualStudio.SpecFlowConnector.V1\Generation\BaseGenerator.cs:line 14at SpecFlow.VisualStudio.SpecFlowConnector.Generation.GenerationProcessor.Process() in D:\a\1\s\Connectors\SpecFlow.VisualStudio.SpecFlowConnector.V1\Generation\GenerationProcessor.cs:line 41at SpecFlow.VisualStudio.SpecFlowConnector.ConsoleRunner.EntryPoint(String[] args) in D:\a\1\s\Connectors\SpecFlow.VisualStudio.SpecFlowConnector\ConsoleRunner.cs:line 34
按顺序排摸检查
1. 包是否 Download 到 NuGet packages 文件夹
SpeFlow 会在 NuGet packages 文件夹中搜索 Plugins,相关的 reference 是 TechTalk.SpecFlow.dll,如果这个 DLL 没有从 NuGet Source Repo 上 Download 到 NuGet packages 文件夹,那么这个 Plugins 是不会被发现的。
NuGet packages 文件夹默认是 C:\Users\user name\ .nuget\packages
找到 Specflow 包对应的版本号
2. 查看中间缓存包
中间缓存包是从 NuGet Packages 文件夹加载来的。一旦加载了就不会每次再从 NuGet Packages 文件夹中获取,所以这个文件夹中有可能是加载了老的 DLL,所以删除这个中间缓存文件夹对应的包。
中间缓存包文件夹是 C:\Users\user name\AppData\Roaming\NuGet\Ref\packages\SpecFlow.3.9.74\lib\net461
3. 项目 \bin\Debug 是否存在 DLL
\bin\Debug 文件的 DLL 是从中间缓存包文件夹中加载的,
查看项目 \bin\Debug 文件夹是否已经存在 DLL, 如果存在有可能是老的 DLL,可以尝试关掉 VS,删除 \bin\Debug 文件夹,再次打开 Solution 进行编译即可。
快速解决方案
因为历史原因,常年累月,本地的 NuGet Packages 可能下载过很多包,同一个包的不同版本,同一版本的不同 .NET Framework 的包,比较混乱,可以全部清理一下。
这里分享一个血一般的教训
,一定要注意包对应的版本,尤其是 .NET Framework 的版本。比如之前有下载过 Specflow 2.4,是对应 net45 版本,而后面需要下载一个 net461 版本,一直不成功,就是因为存在了 Specflow 2.4 net45 版本 。这里订正一下,SpecFlow 2.4 是就是对应 NET45 版本的,之所以装 SpecFlow 2 版本会碰到这种问题,是因为前面装了 SpecFlow 3 的各种版本,后面再装 SpecFlow 2 就会有问题,执行下面步骤就能解决。
依次按下面三个步骤:
1. 清空依赖包文件夹
将下面涉及到的 NuGet Packages 文件夹,中间缓存包文件夹,项目 bin\Debug 文件夹分别清空。
C:\Users\user name\ .nuget\packages
C:\Users\user name\AppData\Roaming\NuGet\Ref\packages
C:\Work\SpecFlowDemo\SpecFlowSpecRun\bin\Debug
2. Restore NuGet Packages
右键 Solution -> Restore NuGet Packages
Solution 各个项目中的 packages.config 配置的依赖包会从 NuGet Source Repo 上重新下载到本地 NuGet Packages 文件夹中
3. 重新 Build Solution
中间缓存包文件中会从 NuGet Packages 文件夹中获取包,bin\Debug 再从中间缓存包文件加载 Dll,问题应该能得到解决。
这篇关于BDD - SpecFlow Troubleshooting:Unable to find plugin in the plugin search path: SpecRun的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!