为什么我们需要在全球和本地安装gulp ?

关于狼吞虎咽地吃的2个手册说,我需要先全局安装gulp(带-g标志),然后在本地再安装一次。我为什么需要这个?

150776 次浏览

在全局安装工具时,用户可以在任何地方(包括节点项目之外)将其作为命令行实用程序使用。节点项目的全局安装是,因为它们使部署更加困难。

npm 5.2 +

npm 5.2绑定的npx实用程序解决了这个问题。有了它,你可以调用本地安装的实用程序,就像全局安装的实用程序一样(但是你必须以npx开始命令)。例如,如果你想调用本地安装的eslint,你可以这样做:

npx eslint .

npm & lt;5.2

当在包的script字段中使用时。npmnode_modules中搜索该工具以及全局安装的模块,因此本地安装就足够了。

所以,如果你满意(在你的package.json):

"devDependencies": {
"gulp": "3.5.2"
}
"scripts": {
"test": "gulp test"
}

等等,并且使用npm run test运行,那么你根本不需要全局安装。

由于不需要sudo,这两个方法对于让人们与你的项目建立联系都很有用。它还意味着当包中的版本被碰撞时,gulp将被更新。因此,在开发项目时,每个人都将使用相同版本的gulp。

附录:

在全局使用时,gulp似乎有一些不寻常的行为。当用作全局安装时,gulp会寻找一个本地安装的gulp以将控制传递给它。因此,gulp全局安装需要gulp本地安装才能工作。上面的答案仍然成立。本地安装总是比全局安装更可取。

从技术上讲,如果本地安装中的node_modules文件夹在PATH中,则不需要全局安装它。一般来说,这不是一个好主意。

或者,如果npm test引用gulp,则只需键入npm test,它将运行本地gulp。

我从未全局安装过gulp——我认为这是一种糟糕的形式。

TLDR;为什么:

这是因为gulp尝试使用本地安装的gulp版本运行你的gulpfile.js,参见在这里。因此需要在全局和本地安装gulp。

本质上,当你在本地安装gulp时,脚本不在你的PATH中,所以你不能只输入gulp并期望shell找到命令。通过全局安装它,gulp脚本进入你的PATH,因为全局node/bin/目录最有可能在你的路径上。

不过,为了尊重你的本地依赖关系,gulp将使用自己的本地安装版本来运行gulpfile.js. dll。

我不确定我们的问题是否与只在本地安装gulp直接相关。但是我们必须自己安装一堆依赖。这导致了一个“巨大”的包裹。我们不确定只在本地安装gulp是否真的是个好主意。我们必须这样做是因为我们的构建环境。但如果不是绝对必要的话,我不建议非全局安装gulp。我们面临类似的问题,如下篇博文所述

我们的任何开发人员在他们的本地机器上都不会遇到这些问题,因为他们都在全局安装了gulp。在构建系统上,我们遇到了所描述的问题。如果有人感兴趣,我可以深入研究这个问题。但是现在我只想说,只在本地安装gulp并不容易。

你可以在本地链接全局安装的gulp

npm link gulp

问题“为什么我们需要在全球和本地安装gulp ?”可以分解为以下两个问题:

  1. 为什么我需要在本地安装gulp,如果我已经在全局安装它?< / em >

  2. 如果我已经在本地安装了gulp,为什么我需要全局安装它?< / em >

其他几个人已经单独对这些问题提供了很好的答案,但我认为在一个统一的答案中巩固这些信息将是有益的。

如果我已经在全局安装了gulp,为什么还需要在本地安装它?

在本地安装gulp的基本原理包括以下几个原因:

  1. 在本地包含项目的依赖项可以确保所使用的gulp(或其他依赖项)的版本是最初的预期版本。
  2. Node在使用require()(需要在脚本中包含gulp)时默认不考虑全局模块。最终,这是因为默认情况下全局模块的路径没有添加到NODE_PATH。
  3. 根据Node开发团队的说法,本地模块加载速度更快。我不能说为什么会这样,但这似乎与节点在生产中的使用(即运行时依赖)比在开发中的使用(即开发依赖)更相关。我认为这是一个合理的原因,因为有些人可能会关心加载局部模块和全局模块所获得的任何微小的速度优势,但请随意对这个原因表示不满。

如果我已经在本地安装了gulp,为什么还需要全局安装它?

  1. 全局安装gulp的基本原理实际上只是为了方便在系统路径中自动找到gulp可执行文件。

为了避免在本地安装,你可以使用npm link [package],但是link命令以及install --global命令似乎不支持--save-dev选项,这意味着似乎没有一个简单的方法来全局安装gulp,然后轻松地将任何版本添加到你的本地包中。json文件。

最终,我相信使用全局模块的选项更有意义,以避免在所有项目中重复安装通用工具,特别是在诸如grunt、gulp、jshint等开发工具的情况下。不幸的是,当你违背常理时,似乎你最终会与工具作斗争。

只是因为我在这里没有看到它,如果你是在MacOS或Linux上,我建议你把它添加到你的PATH(在你的bashrc等):

node_modules/.bin

使用这个相对路径条目,如果你位于任何节点项目的根文件夹中,你可以运行任何命令行工具(eslint、gulp等),而不用担心“全局安装”或npm run等。

一旦我这样做了,我就从来没有全局安装过一个模块。