如何在GitHub Actions中用lerna执行jest单测并解决jest: not found报错
问题根因
你遇到的jest: not found错误本质是CI环境中子包的devDependencies没有被正确安装,导致子包node_modules/.bin路径下没有生成jest的可执行文件,可按照以下步骤逐一修复:
1. 调整CI依赖安装逻辑
你当前依赖postinstall钩子自动执行lerna bootstrap,但npm不同版本对钩子的触发逻辑和workspaces的兼容有差异,容易出现子包依赖漏装的问题。建议在CI步骤中显式执行bootstrap命令,同时用npm ci替代npm install保证依赖版本和本地完全一致:
- name: Install Dependencies run: npm -v && npm ci && npm run bootstrap
2. 修正缓存配置
你当前只缓存了npm全局缓存目录,没有缓存根目录和子包的node_modules,不仅会拖慢CI速度,也可能出现依赖安装不完整的问题。修改缓存配置如下:
- name: Cache node modules uses: actions/cache@v2 env: cache-name: cache-node-modules with: path: | node_modules packages/*/node_modules ~/.npm key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}-
注意要提前把根目录和所有子包的package-lock.json提交到仓库,否则缓存key计算会失效。
3. 兜底修复方案
如果调整后仍报错,可以通过两种方式兜底:
- 把子包的test脚本改为用npx调用jest,确保能自动匹配到可执行文件:
// packages/core/package.json "scripts": { "test": "npx jest --coverage" } - 把jest、ts-jest等公共测试依赖安装到根目录的
devDependencies中,所有子包会自动继承根目录的可执行文件路径。
可选优化
你可以在lerna.json中配置依赖提升,避免重复安装子包公共依赖,也能减少路径找不到的问题:
{ "command": { "bootstrap": { "hoist": true } } }
内容的提问来源于stack exchange,提问作者philip Lau
相关产品推荐
相关产品推荐

