全局安装 npm 包的替代方案

1,312 阅读4分钟

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

  • 在本地,进入node_modulesnpm 在当前目录及其祖先中搜索(或创建)的目录:

    npm install some-package
    
  • 全局,进入全局node_modules目录:

    npm install --global some-package
    

    (除了这个标志的长版本--global,我们也可以使用更短的-g。)

后者需要 macOS 和其他一些 Unix 平台上的 root 访问权限——这是一个相当大的缺点。这就是为什么这篇博客文章探讨了全局安装的替代方案。

准备工作:更改命令行 PATH   

我们需要为某些方法更改命令行 PATH。这个 PATH 是一个命令行变量,它列出了当我们输入命令时命令行查找可执行文件的所有路径。如果我们想通过 npm 安装可执行文件,正确设置 PATH 非常重要。

网上有很多很好的教程,只要上网搜索一下:

  • Windows:设置路径 powershell
  • MacOS:设置路径 zsh
  • Linux(例如):设置路径 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'

波浪号 ( ~) 本身是指 Unix 和 Windows 上的主目录。除了那个符号,我们还可以使用 shell 变量$HOME(在 Unix 和 Windows 上),但必须注意 shell 变量的扩展。

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

安装包  

我们现在可以继续使用 flag 安装软件包--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

每个提供的可执行文件cmdsome-package我们还得到:

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

也就是说,可执行文件是包的链接。

优点和缺点  

  • Pro:~/package.json记录所有已安装的软件包。这有助于重新安装。
  • 缺点:我们必须先进入主目录才能安装包。
  • 缺点:主目录中的三个新文件 – package.jsonpackage-lock.jsonnode_modules.

安装到主目录的子目录中  

这种方法是方法 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

优点和缺点  

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

方法 4:使用 npx   

如果我们感兴趣的可执行文件与其包同名,则 npx 是一个选项。(这不是一个严格的要求,但我们必须输入更多。)

它的工作原理如下。如果我们cowsay全局安装可执行文件并以这种方式运行它:

cowsay 'Moo'

然后我们也可以这样运行它——无需安装任何东西:

npx cowsay 'Moo'

我们第一次使用这个命令时,npx 下载cowsay到用户本地缓存并从那里运行它。下载可能需要一些时间,但只需要一次。因此,从第二次开始,cowsay通过 npx 运行几乎与运行已安装版本一样快。

npm 文档有更多关于 npx的信息。

优点和缺点  

  • 优点:无需安装——这对于我们不经常需要的可执行文件非常有用。
  • 缺点:运行可执行文件意味着更多的输入。
  • 缺点:如果可执行文件与其包的名称不同,则不是一个真正的选择。
  • 缺点:使离线准备变得更加困难。

方法 5:使用 Node.js 版本管理器  

有一些工具可以让我们安装多个 Node.js 版本并在它们之间切换——例如:

这些工具通常将 npm 前缀设置为当前主目录内的某个目录。