Почему нам нужно установить gulp глобально и локально?

292

2 руководства по gulp говорят, что мне нужно сначала установить gulp глобально (с флагом -g), а затем еще раз локально. Зачем мне это?

Степан Суворов
источник
12
На собственной странице проекта «Начало работы» говорится то же самое. (Также не говорит, почему.)
TJ Crowder
11
Я хотел бы, чтобы npm мог использовать глобально установленный пакет зависимостей, который имеет ту же версию, что и локальный пакет. 5 МБ данных для каждого каталога проекта: /
Ciantic
@Ciantic Нет гарантий, но ... ➪ stackoverflow.com/a/25879563/444255
Фрэнк Нок

Ответы:

238

При глобальной установке инструмента он должен использоваться пользователем в качестве утилиты командной строки где угодно, в том числе за пределами узловых проектов. Глобальные установки для проекта узла плохи, потому что они усложняют развертывание.

нпм 5.2+

npxУтилита в комплекте с npm 5.2решает эту проблему. С его помощью вы можете вызывать локально установленные утилиты, такие как глобально установленные утилиты (но вы должны начать команду с npx). Например, если вы хотите вызвать локально установленный eslint, вы можете сделать:

npx eslint .

нпм <5,2

Когда используется в scriptполе вашего package.json, 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. Ответ выше все еще стоит, хотя. Локальные установки всегда предпочтительнее глобальных.

qubyte
источник
3
Да, но что, когда у вас нет доступа в интернет? Как вы можете использовать gulp, если он не установлен глобально?
ИГРАЧ
3
@IGRACH Приведенный выше скрипт не использует подключение к интернету. Если вы хотите сделать то же самое без использования поля сценария в package.json, используйте ./node_modules/.bin/gulp.
Кбайт
1
Я определил псевдонимы для, gulpи coffeeпоэтому команды работают из корня проекта моего узла (например, alias gulp="node_modules/.bin/gulp"). Таким образом, команды просты в использовании, если это необходимо, и глобальные / локальные конфликты версий не возникают.
'23
Спасибо @qubyte! Я думаю, что устанавливать его локально - это хорошая практика в целом. У меня есть еще один вопрос, так что надеюсь, вы поможете мне очистить мой разум. Я попытался установить его глобально, как предлагалось в документе Gulp, без локальной установки. Поэтому, когда я пытаюсь запустить gulp, выдается следующее сообщение об ошибке Local gulp not found in .... Насколько я понимаю, он должен сначала посмотреть на локальные node_modules, а если он не найден, то должен посмотреть на глобально установленные модули, не так ли? Спасибо!
Yeelan
1
Добавил приложение. Надеюсь, что это покрывает странность глотка.
кибайт
82

TLDR; Вот почему :

Причина, по которой это работает, заключается в том, что он gulpпытается запустить gulpfile.jsвашу локально установленную версию gulp, см. Здесь . Отсюда и причина глобальной и локальной установки gulp.

По сути, когда вы устанавливаете gulpлокально, сценария нет в вашем, PATHи вы не можете просто напечатать gulpи ожидать, что оболочка найдет команду. Устанавливая его глобально, gulpскрипт попадает в ваш, PATHпотому что глобальныйnode/bin/ каталог, каталог, скорее всего, находится на вашем пути.

Однако, чтобы уважать ваши локальные зависимости, gulpиспользуйте вашу локально установленную версию для запуска gulpfile.js.

Дуэйн Крукс
источник
1
~ / bin - это соглашение Unix для двоичных файлов для каждого пользователя и по умолчанию в PATH во многих ОС. Gulp должен быть в состоянии связать свой двоичный файл оттуда.
mikemaccana
2
Другими словами, ваш глобально установленный gulpпакет необходим для установки node_modules/.bin/gulpв пути. Хранилище дешево, но выбрасывать МБ для симуляции символической ссылки - чистая небрежность ИМО.
ндт
79

Вы можете связать глобально установленный gulpлокально с

npm link gulp
Берислав Лопач
источник
1
Я знаю, что лучше всего использовать локальную установку, но могут быть случаи, когда вы просто не можете установить ее или просто не хотите (представьте, что на вашем выделенном сервере CI глобально установлен gulp, и вы переустанавливаете его при каждом коммите) , В любом случае +1 за упоминание npm link.
gion_13
1
Я вижу что ты тут делал. Это умно.
17
Это не попытка ответить на вопрос
mikemaccana
1
Нет, это просто делает его недействительным.
Берислав Лопак
67

Вопрос « Зачем нам нужно устанавливать gulp глобально и локально? » Можно разбить на следующие два вопроса:

  1. Зачем мне устанавливать gulp локально, если я уже установил его глобально?

  2. Зачем мне нужно устанавливать gulp глобально, если я уже установил его локально?

Несколько других дали отличные ответы на эти вопросы в отдельности, но я подумал, что было бы полезно объединить информацию в единый ответ.

Зачем мне устанавливать gulp локально, если я уже установил его глобально?

Обоснование установки gulp локально состоит из нескольких причин:

  1. Включение зависимостей вашего проекта локально гарантирует, что используемая версия gulp (или других зависимостей) является изначально предполагаемой версией.
  2. Node не учитывает глобальные модули по умолчанию при использовании require () (который необходимо включить в свой скрипт gulp). В конечном итоге это связано с тем, что путь к глобальным модулям не добавляется в NODE_PATH по умолчанию.
  3. По словам команды разработчиков Node, локальные модули загружаются быстрее. Я не могу сказать, почему это так, но, похоже, это больше относится к использованию узла в производственной среде (т. Е. В зависимости от времени выполнения), чем в процессе разработки (т. Е. В зависимости от dev). Я полагаю, что это законная причина, поскольку некоторые могут заботиться о том, какое незначительное преимущество в скорости получается при загрузке локальных и глобальных модулей, но не стесняйтесь поднять бровь по этой причине.

Зачем мне нужно устанавливать gulp глобально, если я уже установил его локально?

  1. Обоснованием установки gulp на глобальном уровне является удобство автоматического поиска исполняемого файла gulp в вашей системной папке.

Чтобы избежать локальной установки, вы можете использовать npm link [package], но команда link, а также install --globalкоманда, кажется, не поддерживает эту --save-devопцию, что означает, что не существует простого способа установить gulp глобально, а затем легко добавить любую версию для ваш локальный файл package.json.

В конечном счете, я считаю, что более разумно иметь возможность использовать глобальные модули, чтобы избежать дублирования установки общих инструментов во всех ваших проектах, особенно в случае таких инструментов разработки, как grunt, gulp, jshint и т. Д. К сожалению, это кажется, что вы в конечном итоге немного сражаетесь с инструментами, когда идете против зерна.

Дерек Грир
источник
7
+1 за то, что был первым человеком во всем Интернете, чтобы указать, что есть два момента на вопрос. Большинство людей везде просто отвечают: «Зачем мне нужно устанавливать gulp глобально, если я уже установил его локально?» когда я хотел узнать: «Зачем мне устанавливать локально gulp, если я уже установил его глобально?».
Натан Дж. Б.
10
Тот факт, что этот вопрос нуждается в таком сложном объяснении, означает, что это просто не очень логичный способ работы. Устанавливать один и тот же инструмент снова и снова для каждого проекта не нужно.
Кокодоко
4
Твой ответ такой красивый, неэмоциональный. У меня было бы 80% ругательств, так как это было бы глупо. С точки зрения инструментария теория локальной установки, вероятно, верна, но с точки зрения ОС и менеджеров пакетов это настолько безумие, что я не могу найти слов для этого. Какие наркотики принимают ребята из NPM / gulp?!? Если кто-то не согласен, пожалуйста, прочитайте, как менеджер пакетов системы, таких как dpkg, yum, pacman и co. работай.
JepZ
2
@JepZ это просто глоток, потому что супер странно, но в ноде или npm ничего не заставляет. И сохранение определенных версий gulp в проекте имеет смысл только в том случае, если ребята из gulp регулярно ломают версии патчей или что-то в этом роде, другие инструменты сборки обычно являются глобальной установкой. Но ну хорошо. Просто здесь для ругательства.
Stoffe
2
Сейчас это действительно не проблема, так как сообщество перешло к использованию пряжи :)
Дерек Грир,
8

Технически вам не нужно устанавливать его глобально, если node_modulesпапка в вашей локальной установке находится в вашемPATH . Обычно это не очень хорошая идея.

В качестве альтернативы, если npm testссылки, gulpто вы можете просто набратьnpm test и он будет запускать локальный глоток.

Я никогда не устанавливал глоток глобально - я думаю, что это плохая форма.

robrich
источник
3
Лучше, чем указывать это на своем пути, - это использовать сценарии NPM
Jay
2

Я не уверен, была ли наша проблема напрямую связана с установкой gulp только локально. Но нам пришлось самим устанавливать кучу зависимостей. Это привело к созданию «огромного» package.json, и мы не уверены, действительно ли это хорошая идея установить gulp только локально. Мы должны были сделать это из-за нашей среды сборки. Но я бы не советовал устанавливать gulp не в глобальном масштабе, если это не является абсолютно необходимым. Мы столкнулись с похожими проблемами, описанными ниже. блоге

Ни одна из этих проблем не возникает ни у одного из наших разработчиков на своих локальных машинах, потому что все они установлены глобально. В системе сборки у нас были описанные проблемы. Если кому-то интересно, я мог бы глубже погрузиться в этот вопрос. Но сейчас я просто хотел упомянуть, что это не простой способ установить gulp только локально.

tschoartschi
источник
Да, пожалуйста, погрузитесь глубже в этот вопрос.
Кенорб
1

Просто потому, что я не видел этого здесь, если вы работаете в MacOS или Linux, я предлагаю вам добавить это в ваш PATH (в вашем bashrc и т. Д.):

node_modules/.bin

С помощью этой записи относительного пути, если вы находитесь в корневой папке любого проекта узла, вы можете запустить любой инструмент командной строки (eslint, gulp и т. Д. И т. Д.), Не беспокоясь о «глобальных установках» или npm run т. Д.

Как только я это сделал, я никогда не устанавливал модуль глобально.

Эллиот Нельсон
источник