全局安装npm软件包的替代方案

180 阅读4分钟

有两种方式可以安装npm包:

  • 本地,安装到npm在当前目录及其祖先中搜索(或创建)的node_modules 目录中。

    npm install some-package
    
  • 全局性的,安装到一个全局的node_modules 目录中。

    npm install --global some-package
    

    (我们也可以使用较短的-g ,而不是这个标志的长版本--global 。)

后者在macOS和其他一些Unix平台上需要root权限--这是一个相当大的弊端。这就是为什么这篇博文探讨了全局安装的替代方案。


准备:改变命令行PATH

在本博文的其余部分,我们需要为大多数方法改变命令行PATH。这个PATH是一个命令行变量,它列出了当我们输入一个命令时,命令行寻找可执行文件的所有路径。如果我们想通过npm来安装可执行文件,正确设置PATH是很重要的。

网上有很多好的教程,只要在网上搜索一下就可以了。

  • Windows:set path powershell
  • MacOS:设置路径zsh
  • Linux(例如):set path bash

在Windows上,我们可以像这样显示当前的PATH。

$env:PATH

在Unix上,我们可以像这样显示。

echo $PATH

方法1:改变 "npm前缀"

npm文档建议改变npm的前缀。

我们可以像这样显示当前的前缀(我展示的是我的Mac的结果)。

% npm config get prefix
/usr/local

在这个前缀下,有两个重要的子目录。

第一,一个node_modules 目录。

% npm root --global
/usr/local/lib/node_modules

第二,一个bin 目录,其中包含可执行文件。

% npm bin --global
/usr/local/bin

这个目录默认是macOS PATH的一部分。npm将它的链接添加到全局node_modules ,例如。

/usr/local/bin/tsc -> ../lib/node_modules/typescript/bin/tsc

我们如何改变npm的前缀?

设置

我们创建一个目录并将npm的前缀设置为该目录。

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'

tilde (~)本身就是指Unix和Windows上的主目录。我们也可以用shell变量$HOME (在Unix和Windows上)来代替这个符号,但必须注意shell变量的扩展。

之后,我们必须将~/.npm-global 添加到PATH中。

安装软件包

现在我们可以继续用标志--global 来安装软件包,但它们不会被全局安装,而是被安装到我们的主目录。

npm install --global some-package

优点和缺点

  • 优点:npm install --global 在任何地方都适用。
  • 缺点:没有package.json 所安装的东西,使得重新安装更费事。
  • 缺点:npm本身现在也被安装到~/.npm-global (例如,如果你告诉它要自我更新)。

方法2:安装到主目录

全局安装的另一种方法是在本地安装到我们的主目录中的node_modules ,并且只正确设置PATH。

设置

我们首先把我们的主目录变成一个包。

cd ~
npm init --yes

然后我们把"~/node_modules/.bin" 添加到我们的PATH中。

一旦我们安装了我们的第一个软件包,以下的新文件就会存在。

~/node_modules
~/package-lock.json
~/package.json

安装一个软件包

我们不在全局范围内安装一个软件包,而是这样做。

cd ~
npm install some-package

这至少给node_modules 添加了以下目录(可能更多,取决于some-package 有多少个依赖关系)。

~/node_modules/some-package

每一个some-package 提供的可执行文件some-executable ,我们还可以得到。

~/node_modules/.bin/some-executable -> ../some-package/bin/some-executable

也就是说,该可执行文件是进入软件包的一个链接。

优点和缺点

  • 优点:~/package.json 记录所有已安装的软件包。这有助于重新安装。
  • 缺点:我们必须在安装软件包之前进入主目录。
  • 缺点:在主目录中有三个新文件--package.json,package-lock.json,node_modules

鸣谢。这个方法是由Boopathi Rajaa建议的

方法3:安装到主目录的一个子目录下

这种方法是方法2的一个变种。然而,我们不是把我们的主目录变成一个包,而是使用我们主目录的一个子目录。

设置

mkdir ~/npm
cd ~/npm
npm init --yes

然后我们把~/npm/node_modules/bin 添加到我们的PATH中。

一旦我们安装了我们的第一个软件包,以下的新文件就会存在。

~/npm/node_modules
~/npm/package-lock.json
~/npm/package.json

安装一个软件包

cd ~/npm
npm install some-package

优点和缺点

  • 优点:~/npm/package.json 记录所有已安装的软件包。这有助于重新安装。
  • 缺点:我们必须先到~/npm ,然后才能安装一个包。