TypeScript项目中Cucumber安装异常调试求助
问题背景
我有一个基于TypeScript编写的CLI工具,通过传入功能文件路径调用同是TypeScript开发的测试框架。运行测试时出现以下错误:
Error:
You're calling functions (e.g. "setDefaultTimeout") on an instance of Cucumber that isn't running.
This means you have an invalid installation, mostly likely due to:
- Cucumber being installed globally
- A project structure where your support code is depending on a different instance of Cucumber
Either way, you'll need to address this in order for Cucumber to work.
See https://github.com/cucumber/cucumber-js/blob/main/docs/installation.md#invalid-installationsat checkInstall
执行npm why @cucumber/cucumber的输出如下:
@cucumber/cucumber@8.10.0 node_modules/@cucumber/cucumber @cucumber/cucumber@"^8.2.1" from @frameworkPackage@0.5.16 node_modules/@frameworkPackage @frameworkPackage@"*" from @cliMonoRepoTest@1.0.0 packages/cliMonoRepoTest @cliMonoRepoTest@1.0.0 node_modules/@cliMonoRepoTest @cliMonoRepoTest@"^1.0.0" from @cliMonoRepo.anotherMonoRepo1@1.0.0 packages/anotherMonoRepo1 @anotherMonoRepo1@1.0.0 node_modules/@anotherMonoRepo1 workspace packages/anotherMonoRepo from the root project @cliMonoRepoTest@"^1.0.0" from @anotherMonoRepo2@1.0.0 packages/anotherMonoRepo2 @anotherMonoRepo2@1.0.0 node_modules/@anotherMonoRepo2 workspace packages/anotherMonoRepo2 from the root project workspace packages/cliMonoRepoTest from the root project
我已尝试在测试包中硬编码Cucumber版本为8.10.0,确保npm why输出版本统一,但问题仍未解决。当前启动Cucumber测试的代码为:
const cucumberPath = require.resolve(".bin/cucumber-js")
// 也曾尝试更新路径指向node_modules,但无效
调试建议
- 排查全局Cucumber安装:执行
npm list -g @cucumber/cucumber,如果存在全局安装版本,立即卸载:npm uninstall -g @cucumber/cucumber,全局包会和本地包产生实例冲突。 - 强制统一monorepo依赖版本:在根目录
package.json中添加resolutions字段,强制所有子包使用同一版本的Cucumber:
执行"resolutions": { "@cucumber/cucumber": "8.10.0" }npm install后,所有子包将统一拉取指定版本。 - 验证Cucumber实例唯一性:在CLI代码和框架代码中分别添加日志,打印Cucumber模块的实际路径:
若两处输出路径不一致,说明存在多实例,需检查子包是否单独安装了不同版本。console.log('Cucumber module path:', require.resolve('@cucumber/cucumber')); - 调整Cucumber启动方式:放弃调用
.bin/cucumber-js脚本,直接引用本地依赖的Cucumber核心模块启动:
这种方式能确保使用当前项目依赖的唯一实例,避免路径解析错误。const { Cli } = require('@cucumber/cucumber'); // 直接传入参数调用Cli.run Cli.run(['--format', 'progress', './features']); - 清理缓存并重装依赖:删除所有子包的
node_modules、根目录的package-lock.json,执行npm cache clean --force后重新安装,消除缓存导致的版本不一致问题。 - 检查monorepo工作区配置:确认根目录
package.json的workspaces字段正确包含所有子包,避免子包依赖安装在自身node_modules中,导致多实例冲突。
内容的提问来源于stack exchange,提问作者MarioBros

