【问题标题】:npm command - sudo or not?npm 命令 - sudo 与否?
【发布时间】:2013-05-19 10:08:49
【问题描述】:

目前我总是运行sudo npm install <package-name>,但据我所知这是不正确的。

我希望有机会不以 root/Administrator 身份使用它。 我听从了一些建议并使用了这个命令sudo chown -R <username> ~/.npm,但它不起作用......

例如,它是我的npm install jade 的输出

...
npm http 200 https://registry.npmjs.org/amdefine
npm http GET https://registry.npmjs.org/amdefine/-/amdefine-0.0.5.tgz
npm http 200 https://registry.npmjs.org/amdefine/-/amdefine-0.0.5.tgz
npm ERR! Error: EACCES, symlink '../jade/bin/jade'
npm ERR!  { [Error: EACCES, symlink '../jade/bin/jade'] errno: 3, code: 'EACCES', path: '../jade/bin/jade' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

如您所见,下载成功开始但随后失败..

我想知道在 npm 上禁止 sudo 的最佳方法是什么?

【问题讨论】:

    标签: macos npm sudo


    【解决方案1】:

    在没有sudo 的情况下,npm install -g 节点模块是可能的(也是可取的)。

    检查您的/usr/local/share/npm/bin 文件夹的权限。我已经通过 brew 安装了 node 和 npm(没有 sudo),并且那个特定的文件夹最终归 root 拥有。

    这样一劳永逸地修复了它:

    $ sudo chown $(whoami) /usr/local/share/npm/bin
    

    (至于使用 npm 禁止 sudo:您必须为此调整 npm。您自己的节点代码可以使用 https://npmjs.org/package/sudo-blocknpm install sudo-block

    编辑:即使这样可行,我也不再使用 -g。而是使用前缀(参见下一个答案),或者更好的是使用 NIX https://unix.stackexchange.com/a/381797(即使在 OSX 上)

    【讨论】:

    • 我必须更改 /usr/local/bin 和 /usr/local/lib/node_modules 的权限
    • @TelmoDias 我也必须这样做,看来 npm 可能更改了它用于安装全局包的目录
    • 这是一个糟糕的一般答案,因为这会导致用户能够修改全局 PATH 中的二进制文件的安全问题。第二个答案更好。
    • @PureW 我不反对。我越来越多地将包留在用户或项目文件夹中。尽管如此,该建议仍然比使用sudo 更好。
    • -1 回答,参见LFH:/usr 是可共享的只读数据。这意味着 /usr 应该可以在各种符合 FHS 的主机之间共享,并且不能被写入。任何特定于主机或随时间变化的信息都存储在其他地方。大型软件包不得使用 /usr 层次结构下的直接子目录。
    【解决方案2】:

    在我看来是指定 npm 前缀最简洁的方式:

    npm config set prefix ~/.node_modules
    

    然后将以下内容添加到您的 .bash_profile

    export PATH=$HOME/.node_modules/bin:$PATH
    

    现在软件包将安装到您的用户目录中,并且不会损害任何权限。


    编辑:如果您无法安装 yeoman,请在名为 yodoctor 的 PATH 目录之一中创建一个 bash 文件,其中包含以下内容

    #!/bin/bash
    yo doctor
    

    使文件可执行

    chmod +x yodoctor
    

    现在你应该可以安装 yeoman 了。

    【讨论】:

    【解决方案3】:

    我发现这是一个更好的解决方案

    sudo chown -R $USER /Users/$USER

    这只会将您用户的所有者更改为您,并且 npm 应该安装在 OS X 上您的用户下。 我一直在阅读的所有内容都说 sudo 用于 npm 安装是不好的,当您向恶意脚本敞开心扉时,我必须同意他们的观点。

    【讨论】:

      【解决方案4】:

      我不推荐这里提供的两种解决方案,因为它们是蛮力解决方案。相反,我建议阅读One does not simply sudo npm

      【讨论】:

        【解决方案5】:

        你也可以这样做:

        sudo chown -R $USER /usr/local
        

        并递归地将文件更改为您当前的用户。

        【讨论】:

        • -1 回答,参见LFH:/usr 是可共享的只读数据。这意味着 /usr 应该可以在各种符合 FHS 的主机之间共享,并且不能被写入。任何特定于主机或随时间变化的信息都存储在其他地方。大型软件包不得使用 /usr 层次结构下的直接子目录。