如何npm安装全局而不是root?

时间:2013-08-06 19:00:30

标签: node.js shell

我在unix框中,我没有root权限。

我将.npmrc文件(在我用户的根目录中)更改为:

prefix=~/global_npm

现在,当我执行“npm install -g packagename”时,它将安装在我的global_npm目录中。这很好。 然后我通过使用:

更新我的.bashrc文件给自己路径访问权限
export PATH=$PATH:~/global_npm/bin

我还需要做其他事吗?我想我需要设置NODE_PATH,但我不确定?

8 个答案:

答案 0 :(得分:48)

Sindre Sorhus在github.com/sindresorhus/guides有一位很棒的向导,我已经转发到这里。


在OS X和Linux上没有sudo的情况下全局安装npm软件包

默认情况下,npm会在您的项目中本地安装软件包。您还可以全局安装包(例如npm install -g <package>)(对命令行应用程序很有用)。但是,这样做的缺点是你需要root(或使用sudo)才能全局安装。

以下是为给定用户全局安装软件包的方法。

1。为全局包创建目录

mkdir "${HOME}/.npm-packages"

2。引用此目录以供将来在.bashrc / .zshrc

中使用
NPM_PACKAGES="${HOME}/.npm-packages"

3。指示npm存储全局安装包的位置。在$HOME/.npmrc文件中添加:

prefix=${HOME}/.npm-packages

4。确保node能够找到它们。将以下内容添加到您的.bashrc / .zshrc

NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

5。确保您找到已安装的二进制文件和手册页。将以下内容添加到您的.bashrc / .zshrc

PATH="$NPM_PACKAGES/bin:$PATH"
# Unset manpath so we can inherit from /etc/manpath via the `manpath`
# command
unset MANPATH # delete if you already modified MANPATH elsewhere in your config
MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

查看npm-g_nosudo以自动执行上述步骤


注意:如果您运行的是OS X,.bashrc文件可能尚不存在,终端将从另一个文件中获取其环境参数,例如{{1} }或.profile。这些文件也位于用户的主文件夹中。在这种情况下,只需将以下行添加到它们将指示Terminal也加载.bash_profile文件:

.bashrc

答案 1 :(得分:4)

除非您因依赖性而需要安装软件包,这种情况很少见,我建议您使用NVM(https://github.com/creationix/nvm)来安装Node。

如果您在没有sudo的情况下执行此操作,则在全局安装模块时也不需要使用sudo。

答案 2 :(得分:1)

  1. 启动新的终端会话或只输入&#34; source~ / .bashrc&#34;
  2. 现在您可以运行任何可执行文件,例如grunt / bower / yo / whatever(取决于您在全球安装的npm软件包)。
  3. P.S。 BTW更改全局npm目录可以通过命令完成:npm config set prefix~ / global_npm

答案 3 :(得分:1)

我对Rowno's answer的编辑已被拒绝,我无法发表评论,因此我将在此发布在.bashrc中添加的行的版本。

我在其中所做的编辑是将export添加到NODE_PATH和MAN_PATH的分配中,然后简化了MANPATH分配。我还为NODE_PATH设置了:可选,以防万一它没有先验值。这里的其他修改只是个人喜好,但我没有将它们包括在原始编辑中。

npm_global=~/.npm-global
export NODE_PATH="$npm_global/lib/node_modules${NODE_PATH:+:}$NODE_PATH"
PATH="$npm_global/bin:$PATH"
export MANPATH="$npm_global/share/man:$(unset MANPATH; manpath)"

具有export可以确保在可能需要它们的子进程之间共享变量(例如nodeman),以防万一尚未声明或分配变量以前导出属性。指定导出到PATH OTOH非常可选。

我实际上发现在为MANPATH附加值之前重置MANPATH是不寻常的,因为某些脚本可能还会在其前面添加自定义值。我建议用户确保.bashrc或任何其他基于用户的初始化脚本至少不要添加其他类似的行。对于全局配置,我认为应该通过/etc/manpath.config或类似的方式正式添加路径,因此很有可能是另一种担心。

答案 4 :(得分:1)

许多设置已经期望在~/.local/bin/中找到二进制文件。因此,此答案遵循该约定。其他文件将安装到~/.local/lib/node_modules/

1。配置npm

运行:

npm config set prefix ~/.local  

2。确保~/.local/bin在您的PATH中

运行echo "$PATH"以查看您的路径。如果尚未包含~/.local/bin/,则需要配置系统以包含它。

echo 'PATH=~/.local/bin/:$PATH' >> ~/.bashrc

.bashrc替换为您正在使用的Shell的配置文件。

3。全局安装软件包

npm install -g packagename

答案 5 :(得分:0)

如果您正在安装二进制实用程序(我在您更新PATH时收集的内容),那么您就需要做的就是。

NODE_PATH只需要设置你已经从不相关的节点脚本安装了一个你想要require()的模块,但你不应该真的这样做。作为其他模块/脚本的依赖项所需的模块应该在本地安装(即在package.json中指定),因为这样可以严格控制版本。

编辑: 这里接受的答案解释得比我能够好得多: How do I install a module globally using npm?

答案 6 :(得分:-1)

Rowno的回答对我有用,但只是在对第4步进行了轻微编辑之后:

NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

并将其更改为:

NODE_PATH="$NPM_PACKAGES/node_modules:$NODE_PATH"

答案 7 :(得分:-4)

尝试切换用户:

su - username

如果您没有其他用户,请尝试:

useradd username

然后,

su - username