Termux中无法运行package.json定义的脚本问题求助
解决Termux中npm脚本spawn ENOENT错误的方案
问题描述
我正在搭建移动Node环境,但无法在Termux中运行package.json里定义的脚本。执行npm run prettier或其他脚本时出现如下错误日志:
0 info it worked if it ends with ok 1 verbose cli [ '/data/data/com.termux/files/usr/bin/node', '/data/data/com.termux/files/usr/bin/npm', 'run', 'prettier' ] 2 info using npm@5.6.0 3 info using node@v8.9.3 4 verbose run-script [ 'prettier' ] 5 info lifecycle examplepackage@1.0.0~prettier: examplepackage@1.0.0 6 verbose lifecycle examplepackage@1.0.0~prettier: unsafe-perm in lifecycle true 7 verbose lifecycle examplepackage@1.0.0~prettier: PATH: /data/data/com.termux/files/usr/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/data/data/com.termux/files/home/examplepackage/node_modules/.bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets 8 verbose lifecycle examplepackage@1.0.0~prettier: CWD: /data/data/com.termux/files/home/examplepackage 9 silly lifecycle examplepackage@1.0.0~prettier: Args: [ '-c', 'prettier --write main.js' ] 10 info lifecycle examplepackage@1.0.0~prettier: Failed to exec prettier script 11 verbose stack Error: examplepackage@1.0.0 prettier: `prettier --write main.js` 11 verbose stack spawn ENOENT 11 verbose stack at ChildProcess.<anonymous> (/data/data/com.termux/files/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:48:18) 11 verbose stack at emitTwo (events.js:126:13) 11 verbose stack at ChildProcess.emit (events.js:214:7) 11 verbose stack at maybeClose (internal/child_process.js:925:16) 11 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5) 12 verbose pkgid examplepackage@1.0.0 13 verbose cwd /data/data/com.termux/files/home/examplepackage 14 verbose Linux 3.18.31-perf-g64ca40a-00128-g77c6b6b 15 verbose argv "/data/data/com.termux/files/usr/bin/node" "/data/data/com.termux/files/usr/bin/npm" "run" "prettier" 16 verbose node v8.9.3 17 verbose npm v5.6.0 18 error file sh 19 error code ELIFECYCLE 20 error errno ENOENT 21 error syscall spawn 22 error examplepackage@1.0.0 prettier: `prettier --write main.js` 22 error spawn ENOENT 23 error Failed at the examplepackage@1.0.0 prettier script. 23 error This is probably not a problem with npm. There is likely additional logging output above. 24 verbose exit [ 1, true ]
使用的package.json内容:
{ "name": "examplepackage", "version": "1.0.0", "description": "", "main": "main.js", "dependencies": { "axios": "^0.17.1" }, "devDependencies": { "prettier": "^1.9.2" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "prettier": "prettier --write main.js" }, "author": "", "license": "ISC" }
错误分析
从错误日志里的spawn ENOENT可以看出,npm找不到prettier命令的可执行文件。虽然你已经把prettier安装为开发依赖,但Termux的环境变量或者npm的脚本执行机制可能没正确识别到本地node_modules里的bin文件。
解决建议
这里有几个可行的解决方案,按优先级尝试:
1. 使用npx调用本地prettier
修改package.json里的prettier脚本,用npx来指定调用本地安装的prettier:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "prettier": "npx prettier --write main.js" }
npx会自动在项目的node_modules/.bin目录里查找对应的可执行文件,能避免环境变量路径问题。
2. 直接指定prettier的本地路径
如果npx不好用,也可以直接写prettier的相对路径:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "prettier": "./node_modules/.bin/prettier --write main.js" }
这样npm就能精准找到prettier的可执行文件了。
3. 检查依赖是否正确安装
有时候依赖安装可能不完全,先删除node_modules和package-lock.json,重新安装:
rm -rf node_modules package-lock.json npm install
确保安装过程没有报错,之后再尝试运行脚本。
4. 更新npm和node版本
你当前使用的npm@5.6.0和node@v8.9.3版本比较老旧,Termux对新版本的Node.js支持更好。可以尝试更新:
pkg upgrade nodejs
更新后再重新安装依赖并运行脚本,新版本的npm在脚本执行路径处理上更稳定。
内容的提问来源于stack exchange,提问作者SebastianD
相关产品推荐
相关产品推荐

