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


当前回答

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

npm link gulp

其他回答

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

或者,如果npm test引用了gulp,那么你只需要输入npm test,它就会运行本地的gulp。

我从未全局安装过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等开发工具的情况下。不幸的是,当你违背常理时,似乎你最终会与工具作斗争。

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

npm link gulp

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

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

TLDR;原因如下:

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

从本质上讲,当您在本地安装gulp时,脚本不在您的PATH中,因此您不能仅仅键入gulp并期望shell找到该命令。通过全局安装它,gulp脚本进入您的PATH,因为全局节点/bin/目录最有可能在您的路径上。

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