有两种方式可以安装 npm 包:
-
在本地,进入
node_modules
npm 在当前目录及其祖先中搜索(或创建)的目录: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
每个提供的可执行文件cmd
,some-package
我们还得到:
~/node_modules/.bin/cmd -> ../some-package/bin/cmd
也就是说,可执行文件是包的链接。
优点和缺点
- Pro:
~/package.json
记录所有已安装的软件包。这有助于重新安装。 - 缺点:我们必须先进入主目录才能安装包。
- 缺点:主目录中的三个新文件 –
package.json
,package-lock.json
,node_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 前缀设置为当前主目录内的某个目录。