Github Actions中npm无法识别build_js脚本的问题求助
问题分析
本地构建正常但GHA中报错sh: 1: build_js: not found,核心原因是:npm workspaces默认不会将根node_modules/.bin中的可执行文件自动暴露给子包的脚本执行环境(本地可能因缓存或链接机制隐式生效,但GHA是全新环境),子包的build脚本直接调用build_js时,系统PATH中找不到该命令。
无需给子包添加依赖的解决方案
方案1:子包脚本改用npx调用
修改所有子包的package.json中的build脚本:
{ "scripts": { "build": "npx build_js" } }
npx会自动从项目根目录的node_modules/.bin中查找并执行build_js,无需子包单独声明依赖。
方案2:在GHA构建步骤中手动添加根bin路径到环境变量
修改GHA的构建步骤,将根node_modules/.bin加入系统PATH:
- name: Build project run: PATH="$PATH:./node_modules/.bin" npm run build-all
这样子包执行build_js时,系统会从根目录的bin目录中找到对应的可执行文件。
方案3:使用Lerna exec指定执行环境
修改根package.json的build-all脚本,通过lerna exec传递PATH:
{ "scripts": { "build-all": "lerna exec --env PATH=\"$PATH:$(pwd)/node_modules/.bin\" -- npm run build" } }
或者直接在GHA中用lerna exec执行构建:
- name: Build project run: lerna exec -- PATH="$PATH:$(pwd)/node_modules/.bin" npm run build
这种方式会给每个子包的执行环境注入根bin路径,确保build_js可被找到。
方案4:在根目录添加prepare脚本自动链接本地包
在根package.json中添加prepare脚本,安装依赖后自动链接build-scripts包:
{ "scripts": { "prepare": "npm link ./packages/build-scripts" } }
npm link会将本地的build-scripts包链接到全局node_modules,这样无论哪个子包执行build_js都能找到命令。GHA环境中无需额外权限,因为操作的是当前用户的全局目录。
验证建议
修改后可以在本地模拟GHA环境:删除node_modules和package-lock.json,重新执行npm install后运行npm run build-all,确认是否能复现并解决问题。
内容的提问来源于stack exchange,提问作者sydd

