关于gulp的2本手册说我需要首先全局安装gulp(使用-g标志)然后再在本地安装一次gulp。我为什么需要这个?
答案 0 :(得分:231)
在全局安装工具时,用户可以将其用作任何位置的命令行实用程序,包括节点项目外部。节点项目的全局安装错误,因为它们使部署更加困难。
与npm
5.2
捆绑在一起的npx
实用程序解决了这个问题。有了它,您可以调用本地安装的实用程序,如全局安装的实用程序(但您必须使用npx
开始命令)。例如,如果要调用本地安装的eslint
,则可以执行以下操作:
npx eslint .
在package.json的script
字段中使用时,npm
会在node_modules
中搜索该工具以及全局安装的模块,因此本地安装就足够了。
所以,如果你对(在你的package.json中)感到满意:
"devDependencies": {
"gulp": "3.5.2"
}
"scripts": {
"test": "gulp test"
}
等。并且使用npm run test
运行,那么您根本不需要全局安装。
这两种方法对于让人们设置项目非常有用,因为不需要sudo
。这也意味着当版本在package.json中出现时,gulp
将会更新,因此在使用您的项目进行开发时,每个人都将使用相同版本的gulp。
看来gulp在全球使用时有一些不寻常的行为。当用作全局安装时,gulp会查找本地安装的gulp以将控制权传递给。因此,gulp全局安装需要gulp本地安装才能工作。上面的答案仍然有效。本地安装始终优于全局安装。
答案 1 :(得分:80)
TLDR;这是why:
这可行的原因是
gulp
尝试使用您当地安装的gulpfile.js
版本运行gulp
,请参阅here。因此,全球和本地安装gulp的原因。
基本上,当您在本地安装gulp
时,脚本不在您的PATH
中,因此您无法输入gulp
并期望shell找到命令。通过全局安装,gulp
脚本会进入您的PATH
,因为全局node/bin/
目录很可能位于您的路径上。
要尊重您的本地依赖关系,gulp
将使用您自己的本地安装版本来运行gulpfile.js
。
答案 2 :(得分:78)
您可以将全局安装的gulp
本地链接到
npm link gulp
答案 3 :(得分:63)
问题" 为什么我们需要在全球和本地安装gulp?"可以分解为以下两个问题:
如果我已经在全球范围内安装gulp,为什么还需要在本地安装gulp?
如果我已在本地安装gulp,为什么还要全局安装gulp?
其他几个人已经孤立地为这些问题提供了出色的答案,但我认为在统一答案中整合信息是有益的。
如果我已经在全球范围内安装gulp,为什么还需要在本地安装gulp?
本地安装gulp的基本原理包括以下几个原因:
如果我已在本地安装gulp,为什么需要全局安装gulp?
为了避免在本地安装,您可以使用npm link [package]
,但是链接命令以及install --global
命令似乎不支持--save-dev
选项,这意味着没有#&# 39;似乎是一种简单的方法来全局安装gulp,然后轻松添加任何版本的本地package.json文件。
最终,我认为选择使用全局模块以避免必须在所有项目中复制常用工具的安装更有意义,尤其是在开发工具(如grunt,gulp,jshint等)的情况下不幸的是,当你反对谷物时,你似乎最终会对抗这些工具。
答案 4 :(得分:8)
从技术上讲,如果本地安装中的node_modules
文件夹位于PATH
,则无需全局安装。一般来说,这不是一个好主意。
或者,如果npm test
引用gulp
,那么您只需输入npm test
即可运行本地gulp。
我从未在全球范围内安装gulp - 我认为这是糟糕的形式。
答案 5 :(得分:2)
我不确定我们的问题是否与本地安装gulp直接相关。但我们必须自己安装一堆依赖项。这导致了一个巨大的" package.json我们不确定在本地安装gulp是否真的是一个好主意。由于我们的构建环境,我们必须这样做。但是如果不是绝对必要的话,我不建议不要全局安装gulp。我们遇到了以下blog-post
中描述的类似问题我们的本地计算机上的任何开发人员都不会出现这些问题,因为他们都在全局安装了gulp。在构建系统上,我们遇到了所描述的问题。如果有人有兴趣,我可以深入研究这个问题。但是现在我只想提一下,在本地安装gulp并不是一条简单的途径。
答案 6 :(得分:0)
只是因为我在这里没有看到它,所以如果您使用的是MacOS或Linux,建议您将其添加到PATH(在bashrc等文件中):
node_modules/.bin
使用此相对路径条目,如果您坐在任何节点项目的根文件夹中,则可以运行任何命令行工具(eslint,gulp等),而不必担心“全局安装”或{{1 }}等
一旦这样做,我就永远不会在全球范围内安装模块。