GitLab CI中CucumberJS无法编译TypeScript问题求助
看起来你遇到的核心问题是:GitLab CI环境里,Cucumber没有通过ts-node正确转译你的TypeScript步骤定义文件,反而把TS代码当成Gherkin特征文件来解析了——这就是为啥它会报错说import语句不是预期的Gherkin语法(比如Feature、Scenario这类)。
下面是针对性的解决方案,按优先级尝试:
1. 调整Cucumber命令的加载顺序与写法
虽然你本地的命令看起来没问题,但CI环境的shell(通常是bash)可能会在Node.js之前解析通配符,导致features/**/*.ts先被shell展开,Cucumber在加载setup脚本之前就拿到了TS文件。可以试试两种写法:
写法一:给路径加引号,避免shell提前解析通配符
修改package.json里的脚本:
"cucumber": "cucumber-js --require 'features/tests.setup.js' --require 'features/**/*.ts'"
写法二:让Node.js直接加载setup脚本,再启动Cucumber
这种方式绕开Cucumber自己的--require加载逻辑,确保ts-node在任何TS文件加载前完成注册:
"cucumber": "node -r ./features/tests.setup.js node_modules/cucumber/bin/cucumber-js features/**/*.ts"
2. 确保CI环境的依赖安装完整
本地Windows环境可能已经装全了依赖,但CI环境如果用npm ci或者跳过了dev依赖,可能会缺失ts-node、typescript这类关键包。检查:
- 把
ts-node、typescript、@types/cucumber都放在devDependencies里 - 在.gitlab-ci.yml的安装步骤中,不要加
--production参数,确保安装所有依赖:script: - npm ci # 或者 npm install - npm run cucumber
3. 统一TypeScript编译配置
你的tests.setup.js里指定了module: commonjs,但最好和项目根目录的tsconfig.json保持一致,避免CI环境下的配置差异。可以修改setup脚本,直接指向项目的tsconfig:
require('ts-node').register({ transpileOnly: true, project: './tsconfig.json' // 用项目根的tsconfig,而不是单独指定compilerOptions });
同时确保tsconfig.json里的module字段确实是commonjs,因为Cucumber运行在Node.js环境,需要CommonJS模块格式。
4. 对齐本地与CI的Node.js版本
不同Node.js版本对ts-node的兼容性可能有差异,比如本地用v18,CI用v14,就可能出现转译问题。在.gitlab-ci.yml里指定和本地一致的Node版本:
image: node:18 # 替换成你本地用的Node版本
5. 验证CI环境的TS转译是否正常
可以在CI脚本里加一步测试,手动验证ts-node能否正确转译你的TS文件:
script: - npm ci - npx ts-node features/step-definitions/steps.calculus-triangle.ts # 测试转译 - npm run cucumber
如果这一步报错,说明ts-node在CI环境的配置有问题,先解决这个问题再跑Cucumber。
内容的提问来源于stack exchange,提问作者Ambroise Rabier

