有两种方式可以安装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,然后才能安装一个包。