我正在尝试使用我的package.json中的预安装脚本运行npm install命令.我知道它是反模式但我需要以root身份运行一些脚本.
通过向我的根目录添加包含unsafe-perm = true的.npmrc文件,它工作正常.但它不能通过在我的package.json文件中添加配置属性来工作:
{ "name": "foo","version": "1.4.4","config": { "unsafe-perm":true },"scripts" : { "preinstall" : "npm install -g bower" } } // It is not working
根据NPM config docs,可以在我的包文件中添加此属性.我想明白为什么它不起作用.
解决方法
添加该属性时,您将使用前缀npm_config_package将其添加到脚本环境中:
$cat package.json { "config": { "unsafe-perm": true } } $npm run env | grep perm $npm run env | grep perm npm_package_config_unsafe_perm=true npm_config_unsafe_perm=true $sudo npm run env | grep perm npm_package_config_unsafe_perm=true npm_config_unsafe_perm= $
这是出于安全原因,有点儿. npm注册表中的任意包允许您更改npm的配置设置(例如,如果它将前缀设置为/ etc并安装了名为passwd的文件)
但是,您仍然可以通过在脚本行中设置环境变量来绕过它(这在Windows上不起作用):
$cat package.json { "config": { "unsafe-perm": true },"scripts": { "foo": "npm_config_unsafe_perm=true env" } } $npm run foo | grep unsafe_perm npm_config_unsafe_perm=true npm_package_config_unsafe_perm=true npm_lifecycle_script=npm_config_unsafe_perm=true env npm_package_scripts_foo=npm_config_unsafe_perm=true env $sudo npm run foo | grep unsafe_perm npm_config_unsafe_perm=true npm_package_config_unsafe_perm=true npm_lifecycle_script=npm_config_unsafe_perm=true env npm_package_scripts_foo=npm_config_unsafe_perm=true env $
这可能是npm中的错误,所以我建议不要依赖这种行为.你可以使用与root不同的用户吗?
来源:在OSX上使用npm@2.6.1进行测试.我是npm问题跟踪器https://github.com/npm/npm/issues的支持志愿者.