繁体   English   中英

如何 npm install global 不是 root?

[英]How to npm install global not as root?

我在一个没有 root 访问权限的 unix 机器上。

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

prefix=~/global_npm

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

export PATH=$PATH:~/global_npm/bin

我还需要做什么吗? 我想我需要设置 NODE_PATH 但我不确定?

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

source ~/.bashrc

许多设置已经期望在~/.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

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

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

我对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或类似的东西正式添加路径,所以很可能是一个不同的担忧。

  1. 要么启动一个新的终端会话,要么只输入“source ~/.bashrc”
  2. 现在你可以运行任何可执行文件,比如 grunt/bower/yo/whatever(取决于你全局安装的 npm 包)。

PS 顺便说一句,可以使用以下命令更改全局 npm 目录:npm config set prefix ~/global_npm

如果您正在安装二进制实用程序(我认为您在更新PATH就是这样),这几乎就是您需要做的全部工作。

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

编辑:此处接受的答案比我所能解释的要好得多: 如何使用 npm 全局安装模块?

Rowno 的答案对我有用,但仅在对第 4 步进行轻微编辑后才适用:

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

并将其更改为:

NODE_PATH="$NPM_PACKAGES/node_modules:$NODE_PATH"

尝试切换用户:

su - username

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

useradd username

然后,

su - username

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM