You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:31:16