NodeJS 不安全烫发无法在 package.json 上运行

NodeJS unsafe-perm not working on package.json

我正在尝试 运行 npm install 命令和 package.json 上的预安装脚本。我知道这是反模式,但我需要 运行 一些脚本作为 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 可以将此 属性 添加到我的包文件中。我想了解为什么它不起作用。

不安全烫发

默认值:如果 运行 作为 root,则为 false,否则为 true 类型:布尔 设置为 true 以在 运行 包脚本时抑制 UID/GID 切换。如果明确设置为 false,那么作为非 root 用户安装将失败

查看 https://docs.npmjs.com/misc/config#unsafe-perm

当您添加 属性 时,您将其添加到您的脚本环境中,前缀为 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.

的支持志愿者