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

IT技术 javascript gulp
2021-01-23 22:27:58

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

6个回答

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

npm 5.2+

npx捆绑实用程序npm 5.2解决了这个问题。使用它,您可以调用本地安装的实用程序,如全局安装的实用程序(但您必须以 开头命令npx)。例如,如果要调用本地安装的eslint,可以执行以下操作:

npx eslint .

npm < 5.2

scriptpackage.json 的某个字段中使用时npm搜索node_modules工具以及全局安装的module,因此本地安装就足够了。

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

TLDR;这里的原因

这样做的原因是因为gulp尝试gulpfile.js使用本地安装的版本运行您gulp,请参见此处因此,全局和本地安装 gulp 的原因。

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

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

换句话说,您gulp需要全局安装的软件包才能放入node_modules/.bin/gulp路径。存储很便宜,但为了模拟符号链接而丢弃 MB 是 IMO 纯粹的草率。
2021-03-16 22:27:58
~/bin 是针对每个用户的二进制文件的 Unix 约定,并且在许多操作系统上默认位于 PATH 中。gulp 应该能够从那里链接它的二进制文件。
2021-04-08 22:27:58

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

npm link gulp
我看到你在那里做了什么。这很聪明。
2021-03-15 22:27:58
不,它只是使它无效。
2021-03-18 22:27:58
这并不试图回答这个问题
2021-04-03 22:27:58
我知道最好使用本地安装,但可能存在无法安装或不想安装的情况(想象一下,您的专用 CI 服务器全局安装了 gulp,并且您在每次提交时都重新安装它) . 无论如何,提到+1 npm link
2021-04-10 22:27:58

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

  1. 如果我已经在全球范围内安装了 gulp,为什么还需要在本地安装它?

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

其他几个单独地对这些问题提供了很好的答案,但我认为将这些信息整合到一个统一的答案中是有益的。

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

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

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

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

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

为了避免在本地安装,您可以使用npm link [package],但链接命令和install --global命令似乎不支持该--save-dev选项,这意味着似乎没有一种简单的方法可以全局安装 gulp,然后轻松添加任何版本您的本地 package.json 文件。

最终,我认为选择使用全局module以避免在所有项目中重复安装通用工具更有意义,尤其是在开发工具如 grunt、gulp、jshint 等的情况下。不幸的是当您违背常规时,似乎您最终会与工具作斗争。

你的回答是如此美丽,没有感情。我的会有 80% 的脏话,因为这看起来太 ******* 愚蠢了。从工具的角度来看,本地安装理论可能是正确的,但从操作系统的角度和包管理器的角度来看,这太疯狂了,我找不到合适的词来形容。NPM/gulp 的人吃什么药?!?如果有人不同意,请阅读系统包管理器如 dpkg、yum、pacman 和 co. 工作。
2021-03-30 22:27:58
+1 作为整个互联网上第一个指出这个问题有两点的人。大多数地方的每个人都只是回答“如果我已经在本地安装了 gulp,为什么还需要全局安装它?” 当我想知道的是“如果我已经在全球范围内安装了 gulp,为什么还需要在本地安装它?”。
2021-04-03 22:27:58
这个问题需要如此详尽的解释这一事实意味着这根本不是一种非常合乎逻辑的工作方式。没有必要为每个项目一遍又一遍地安装相同的工具。
2021-04-04 22:27:58
现在这真的不是问题,因为社区已经转向只使用纱线 :)
2021-04-05 22:27:58
@JepZ 只是 gulp 非常奇怪,node 或 npm 中没有任何内容强制执行此操作。并且在项目中保留特定版本的 gulp 只有在 gulp 人员定期破坏补丁版本或其他东西时才有意义,其他构建工具通常是全局安装。不过嗯嗯。只是在这里发誓。
2021-04-11 22:27:58

从技术上讲,如果node_modules本地安装中文件夹位于PATH. 通常这不是一个好主意。

或者,如果npm test引用,gulp则您只需键入npm test即可运行本地吞咽。

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

比把它放在你的路径中更好的方法是使用 NPM 脚本
2021-03-20 22:27:58