NodeJS unsafe-perm无法在package.json上运行

nan*_*doj 9 javascript node.js npm package.json

我正在尝试npm install使用预安装脚本运行命令package.json.我知道它是反模式但我需要以root身份运行一些脚本.

通过添加.npmrc包含unsafe-perm = true到我的根目录的文件,它工作正常.但它不能通过在我的package.json文件中添加配置属性来工作:

   {
     "name": "foo",
     "version": "1.4.4",
     "config": {
        "unsafe-perm":true
     },
     "scripts" :  { 
        "preinstall" : "npm install -g bower"
     }
   }
   // It is not working
Run Code Online (Sandbox Code Playgroud)

根据NPM配置文档,可以在我的包文件中添加此属性.我想明白为什么它不起作用.

Sam*_*kes 5

添加该属性时,您将使用前缀将其添加到脚本的环境中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=
$
Run Code Online (Sandbox Code Playgroud)

这是出于安全原因,有点。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
$ 
Run Code Online (Sandbox Code Playgroud)

npm不过,这可能是一个错误,所以我建议不要依赖这种行为。您可以使用与 不同的用户root吗?

来源:npm@2.6.1在 OSX 上测试。我是npm问题跟踪器https://github.com/npm/npm/issues 的一名支持志愿者。