64

我在一个没有root访问权限的unix盒子上。

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

prefix=~/global_npm

现在,当我执行“npm install -g packagename”时,它会安装在我的 global_npm 目录中。哪个好。然后我通过更新我的 .bashrc 文件给了自己访问它的路径:

export PATH=$PATH:~/global_npm/bin

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

4

8 回答 8

95

Sindre Sorhus 在 github.com/sindresorhus/guides 上有一个很棒的指南我在这里转发了它。


在 OS X 和 Linux 上无需 sudo 即可全局安装 npm 包

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

这是一种为给定用户全局安装软件包的方法。

1.为你的全局包创建一个目录

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

.bashrc2. 在您的/中引用此目录以供将来使用.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文件可能还不存在,终端将从另一个文件获取其环境参数,例如.profile.bash_profile. 这些文件也位于用户的主文件夹中。在这种情况下,只需向它们添加以下行将指示终端也加载.bashrc文件:

source ~/.bashrc
于 2014-11-09T05:52:11.243 回答
72

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

1.配置npm

跑:

npm config set prefix '~/.local/'

这将修改~/.npmrc为包括以下行:

prefix=~/.local/

2.确保~/.local/bin存在并且在你的PATH中

跑去echo "$PATH"看看你的路。如果它尚未包含~/.local/bin/,您将需要配置您的系统以包含它。

mkdir -p ~/.local/bin
echo 'export PATH=~/.local/bin/:$PATH' >> ~/.bashrc

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

3. 全局安装包

npm install -g packagename
于 2019-12-07T15:25:54.540 回答
5

除非由于依赖关系而需要安装包,这种情况很少见,否则我建议您使用 NVM ( https://github.com/creationix/nvm ) 安装 Node.js。

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

于 2014-11-11T19:17:17.873 回答
2

我对Rowno 的回答的编辑已被拒绝,我还不能发表评论,所以我将在.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 是不寻常的,因为某些脚本也可能更早地向其添加自定义值。我建议用户确保.bashrc或任何其他基于用户的初始化脚本至少不添加其他类似的行。对于全局配置,我认为应该通过 正式添加路径/etc/manpath.config,或者类似的东西,所以很可能是另一种担心。

于 2019-08-16T18:54:04.900 回答
1
  1. 要么开始一个新的终端会话,要么只输入“source ~/.bashrc”
  2. 现在您可以运行任何可执行文件,例如 grunt/bower/yo/whatever(取决于您全局安装的 npm 包)。

PS BTW 可以使用以下命令更改全局 npm 目录:npm config set prefix ~/global_npm

于 2014-09-07T14:14:37.163 回答
0

That's pretty much all you need to do if you are installing binary utilities (which I gather you are as you updated your PATH).

NODE_PATH will only need to be set you have installed a module that you want to require() from unrelated node scripts, but you shouldn't really do this anyway. Modules that are required as dependencies for other modules/scripts should be installed locally (i.e. specified in a package.json) as that way you keep strict control over versions.

Edit: The accepted answer here explains it much better than I was able to: How do I install a module globally using npm?

于 2013-08-06T19:57:29.440 回答
-1

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

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

并将其更改为:

NODE_PATH="$NPM_PACKAGES/node_modules:$NODE_PATH"
于 2015-12-11T01:43:03.180 回答
-7

尝试切换用户:

su - username

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

useradd username

然后,

su - username
于 2014-11-09T04:00:18.333 回答