为啥我们需要在全局和本地安装 gulp?

Posted

技术标签:

【中文标题】为啥我们需要在全局和本地安装 gulp?【英文标题】:Why do we need to install gulp globally and locally?为什么我们需要在全局和本地安装 gulp? 【发布时间】:2014-04-02 15:35:48 【问题描述】:

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

【问题讨论】:

项目自己的"Getting Started" page 也说了同样的话。 (也没有说明原因。) 我希望 npm 可以使用全局安装的依赖包,它与本地包的版本相同。每个项目目录 5MB 的 glup 内容:/ @Ciantic 不保证,但是... ➪ ***.com/a/25879563/444255 【参考方案1】:

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

npm 5.2+

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

npx eslint .

npm

当在 package.json 的 script 字段中使用时,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 没有全局安装,你如何使用它? @IGRACH 上面的脚本不使用互联网连接。如果您想在不使用 package.json 中的脚本字段的情况下执行相同的操作,请使用 ./node_modules/.bin/gulp 我已经为gulpcoffee 定义了别名,所以这些命令可以从我的节点项目根目录工作(例如alias gulp="node_modules/.bin/gulp")。这样,如果需要,命令很容易使用,并且不会发生全局/本地版本冲突。 感谢@qubyte!我认为在本地安装它通常是一个好习惯。我还有一个问题,希望你能帮助我理清思路。我尝试按照 Gulp 的文档建议在全局范围内安装它,而不在本地安装它。因此,当我尝试运行gulp 时,它给了我以下错误消息Local gulp not found in ...。据我了解,它应该首先查看本地 node_modules,如果没有找到它应该查看全局安装的模块,不是吗?谢谢! 添加了一个附录。希望这涵盖了 gulp 的奇怪之处。【参考方案2】:

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

或者,如果 npm test 引用 gulp,那么您只需键入 npm test,它就会运行本地 gulp。

我从来没有在全球范围内安装过 gulp——我认为这是一种糟糕的形式。

【讨论】:

比把它放在你的路径中更好的方法是使用 NPM 脚本【参考方案3】:

TLDR;这里是why:

之所以有效,是因为gulp 尝试使用您本地安装的gulp 版本运行您的gulpfile.js,请参阅here。这就是全局和本地安装 gulp 的原因。

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

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

【讨论】:

~/bin 是每个用户二进制文件的 Unix 约定,在许多操作系统上默认在 PATH 中。 gulp 应该能够从那里链接它的二进制文件。 换句话说,你需要全局安装的gulp 包来将node_modules/.bin/gulp 放入路径中。存储很便宜,但为了模拟符号链接而丢弃 MB 是 IMO 纯粹的草率。【参考方案4】:

我不确定我们的问题是否与仅在本地安装 gulp 直接相关。但是我们必须自己安装一堆依赖项。这导致了一个“巨大的” package.json,我们不确定只在本地安装 gulp 是否真的是一个好主意。由于我们的构建环境,我们不得不这样做。但如果不是绝对必要,我不建议在全球范围内安装 gulp。我们遇到了类似的问题,如下所述blog-post

我们的任何开发人员在他们的本地计算机上都不会出现这些问题,因为他们都在全球范围内安装了 gulp。在构建系统上,我们遇到了所描述的问题。如果有人感兴趣,我可以深入研究这个问题。但是现在我只想提一下,仅在本地安装 gulp 并非易事。

【讨论】:

是的,请深入探讨这个问题。【参考方案5】:

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

npm link gulp

【讨论】:

我知道最好使用本地安装,但在某些情况下您可能无法安装或不想安装(假设您的专用 CI 服务器已全局安装 gulp 并且您在每次提交时都重新安装它)。无论如何,+1 提到npm link 我知道你在那里做了什么。这很聪明。 这并不试图回答问题 不,它只是使它无效。【参考方案6】:

为什么我们需要在全局和本地安装 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 等开发工具的情况下. 不幸的是,当你违背规则时,你似乎最终会与这些工具作斗争。

【讨论】:

+1 是整个互联网上第一个指出问题有两点的人。世界各地的大多数人都会回答“如果我已经在本地安装了 gulp,为什么还需要全局安装它?”当我想知道“如果我已经在全球范围内安装了 gulp,为什么还需要在本地安装它?”。 这个问题需要如此详尽的解释这一事实意味着这根本不是一种非常合乎逻辑的工作方式。不必为每个项目一遍又一遍地安装相同的工具。 你的回答太漂亮了,没有感情。我的会有 80% 的脏话,因为这似乎太愚蠢了。从工具的角度来看,本地安装理论可能是正确的,但从操作系统的角度和包管理器的角度来看,这太疯狂了,我找不到合适的词。 NPM/gulp 家伙服用什么药物?!?如果有人不同意,请阅读系统包管理器,如 dpkg、yum、pacman 和 co。工作。 @JepZ 只是 gulp 非常奇怪,节点或 npm 中没有任何东西强制这样做。只有在 gulp 人员定期破坏补丁版本或其他情况下,在项目中保留特定版本的 gulp 才有意义,其他构建工具通常是全局安装。不过嗯嗯。只是在这里宣誓。 现在真的不是问题了,因为社区已经开始只使用 yarn :)【参考方案7】:

只是因为我没有在这里看到它,如果您使用的是 MacOS 或 Linux,我建议您将其添加到您的 PATH(在您的 bashrc 等中):

node_modules/.bin

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

完成此操作后,我从未在全局范围内安装过模块。

【讨论】:

以上是关于为啥我们需要在全局和本地安装 gulp?的主要内容,如果未能解决你的问题,请参考以下文章

gulp -- 前端自动化管理工具的使用

跳过 Gulp 的本地安装

本地安装的 gulp 不在命令行中运行?

前端自动化构建(gulp)

学写网站前端配置之glup

gulp