两本关于gulp的手册说我需要先全局安装 gulp(使用 -g 标志),然后再在本地安装一次。为什么我需要这个?
7 回答
在全局安装工具时,用户可以在任何地方将其用作命令行实用程序,包括节点项目之外。节点项目的全局安装很糟糕,因为它们使部署更加困难。
npm 5.2+
npx
捆绑的实用程序npm
5.2
解决了这个问题。使用它,您可以调用本地安装的实用程序,如全局安装的实用程序(但您必须以命令开头npx
)。例如,如果你想调用一个本地安装的eslint
,你可以这样做:
npx eslint .
npm < 5.2
在script
package.json 的字段中使用时,npm
搜索node_modules
该工具以及全局安装的模块,因此本地安装就足够了。
因此,如果您对(在您的 package.json 中)感到满意:
"devDependencies": {
"gulp": "3.5.2"
}
"scripts": {
"test": "gulp test"
}
等等,npm run test
然后运行,你根本不需要全局安装。
这两种方法对于让人们设置您的项目很有用,因为sudo
不需要。这也意味着gulp
当版本在 package.json 中发生碰撞时会更新,因此每个人在使用您的项目开发时都将使用相同版本的 gulp。
附录:
似乎 gulp 在全局使用时有一些不寻常的行为。当用作全局安装时,gulp 会查找本地安装的 gulp 以传递控制权。因此,gulp 全局安装需要 gulp 本地安装才能工作。上面的答案仍然有效。本地安装总是优于全局安装。
gulp
您可以将本地安装的全局链接与
npm link gulp
“为什么我们需要在全局和本地安装 gulp? ”这个问题可以分解为以下两个问题:
如果我已经全局安装了 gulp,为什么还需要在本地安装它?
如果我已经在本地安装了 gulp,为什么还需要全局安装它?
其他几个人单独为这些问题提供了出色的答案,但我认为将信息整合到一个统一的答案中是有益的。
如果我已经全局安装了 gulp,为什么还需要在本地安装它?
在本地安装 gulp 的基本原理包括以下几个原因:
- 在本地包含项目的依赖项可确保使用的 gulp 版本(或其他依赖项)是最初预期的版本。
- Node 在使用 require() 时默认不考虑全局模块(您需要在脚本中包含 gulp)。最终,这是因为默认情况下,全局模块的路径并未添加到 NODE_PATH 中。
- 据 Node 开发团队称,本地模块加载速度更快。我不能说为什么会这样,但这似乎与节点在生产中的使用(即运行时依赖项)比在开发中(即开发依赖项)更相关。我想这是一个正当的理由,因为有些人可能会关心加载本地模块与全局模块所获得的任何微小的速度优势,但出于这个原因,请随意扬眉吐气。
如果我已经在本地安装了 gulp,为什么还需要全局安装它?
- 全局安装 gulp 的基本原理实际上只是为了方便在系统路径中自动找到 gulp 可执行文件。
为避免在本地安装,您可以使用npm link [package]
,但链接命令以及install --global
命令似乎不支持该--save-dev
选项,这意味着似乎没有一种简单的方法可以全局安装 gulp 然后轻松添加任何版本您的本地 package.json 文件。
最终,我相信选择使用全局模块以避免在所有项目中重复安装通用工具更有意义,尤其是在 grunt、gulp、jshint 等开发工具的情况下。不幸的是,它似乎当您违背常规时,您最终会与工具作斗争。
从技术上讲,如果node_modules
本地安装中的文件夹位于您的PATH
. 一般来说,这不是一个好主意。
或者,如果npm test
引用gulp
,那么您只需键入npm test
它就会运行本地 gulp。
我从来没有在全球范围内安装过 gulp——我认为这是一种糟糕的形式。
我不确定我们的问题是否与仅在本地安装 gulp 直接相关。但是我们必须自己安装一堆依赖项。这导致了一个“巨大的” package.json,我们不确定只在本地安装 gulp 是否真的是一个好主意。由于我们的构建环境,我们不得不这样做。但如果不是绝对必要,我不建议在全球范围内安装 gulp。我们遇到了以下博客文章中描述的类似问题
我们的任何开发人员在他们的本地机器上都不会出现这些问题,因为他们都在全球范围内安装了 gulp。在构建系统上,我们遇到了所描述的问题。如果有人感兴趣,我可以深入研究这个问题。但是现在我只想提一下,仅在本地安装 gulp 并非易事。
只是因为我没有在这里看到它,如果您使用的是 MacOS 或 Linux,我建议您将其添加到您的 PATH(在您的 bashrc 等中):
node_modules/.bin
使用此相对路径条目,如果您位于任何节点项目的根文件夹中,则可以运行任何命令行工具(eslint、gulp 等),而无需担心“全局安装”npm run
等。
一旦我这样做了,我就从来没有在全球范围内安装过模块。