blog
blog copied to clipboard
npm: 使用root 用户执行npm lifecycle 命令时报错
npm lifecycle 命令在执行前,会判断配置unsafe-perm为true 时才继续,否则会提前退出。
代码参考:
// lib/utils/lifecycle.js
unsafe = unsafe || npm.config.get('unsafe-perm')
if ((wd.indexOf(npm.dir) !== 0 || _incorrectWorkingDirectory(wd, pkg)) &&
!unsafe && pkg.scripts[stage]) {
log.warn('lifecycle', logid(pkg, stage), 'cannot run in wd',
'%s %s (wd=%s)', pkg._id, pkg.scripts[stage], wd
)
return cb()
}
问题的分析参见:Npm install failed with “cannot run in wd”
配置的读取顺序大致参考:npm-config,即cli -> env -> npmrc -> default。
default中关于unsafe-perm的初始化如下:
// lib/config/defaults.js
'unsafe-perm': process.platform === 'win32' ||
process.platform === 'cygwin' ||
!(process.getuid && process.setuid &&
process.getgid && process.setgid) ||
process.getuid() !== 0
针对unix 平台,使用root 用户执行npm 命令时得到的默认值都会是false。
我的理解大致是避免以root 的身份去执行lifecycle 命令时可能造成的安全问题。
要避开该问题,只要覆盖default中的初始值即可,比如用cli参数或者npm config set unsafe-perm=true。
如果站在项目角度避开该问题,可以采取的措施是在项目中创建.npmrc来覆盖default的配置:
// .npmrc
unsafe-perm = true
但可能需要明确带来的风险。