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


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

npm 5.2 +

与npm 5.2捆绑的npx实用程序解决了这个问题。使用它,您可以像调用全局安装的实用程序一样调用本地安装的实用程序(但必须以npx开头)。例如,如果你想调用本地安装的eslint,你可以这样做:

npx eslint .

NPM < 5.2

当在包的脚本字段中使用时。Json, NPM搜索node_modules工具以及全局安装的模块,所以本地安装就足够了。

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

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

等等,使用NPM运行测试,那么你根本不需要全局安装。

这两种方法都可以帮助人们熟悉你的项目,因为不需要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,因为全局节点/bin/目录最有可能在您的路径上。

为了尊重本地依赖,gulp将使用本地安装的gulpfile.js来运行gulpfile.js。


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

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


您可以将全局安装的gulp链接到本地

npm link gulp

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

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

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

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

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

Including the dependencies of your project locally ensures the version of gulp (or other dependencies) used is the originally intended version. Node doesn't consider global modules by default when using require() (which you need to include gulp within your script). Ultimately, this is because the path to the global modules isn't added to NODE_PATH by default. According to the Node development team, local modules load faster. I can't say why this is, but this would seem to be more relevant to node's use in production (i.e. run-time dependencies) than in development (i.e. dev dependencies). I suppose this is a legitimate reason as some may care about whatever minor speed advantage is gained loading local vs. global modules, but feel free to raise your eyebrow at this reason.

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

全局安装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等。

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