Чому нам потрібно встановлювати gulp глобально та локально?


292

У 2 посібниках про gulp йдеться про те, що мені потрібно встановити gulp спочатку глобально (з прапорцем -g), а потім ще раз локально. Навіщо мені це потрібно?


12
Власна сторінка проекту "Початок роботи" говорить про те саме. (Також не кажуть, чому.)
TJ Crowder

11
Я б хотів, щоб npm міг використовувати глобально встановлений пакет залежності, який є тією ж версією, що і локальний пакет. 5 Мб матеріалу з глупою для кожного каталогу проекту: /
Ciantic

@Ciantic Не гарантує, але ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Відповіді:


238

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

npm 5.2+

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

npx eslint .

npm <5,2

При використанні в scriptполі вашого пакета.json здійснює npmпошук node_modulesінструменту, а також глобально встановлених модулів, тому локальної установки достатньо.

Отже, якщо ви задоволені (у своєму пакеті.json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

і т. д. і працює з npm run testтоді, вам взагалі не знадобиться глобальна установка.

Обидва способи корисні для налаштування людей на ваш проект, оскільки sudoвони не потрібні. Це також означає, що gulpвін буде оновлюватися, коли версія натикається на package.json, тому всі користуватимуться однаковою версією gulp при розробці разом з вашим проектом.

Додаток:

Здається, що глоток має незвичну поведінку при використанні в усьому світі. Якщо використовується як глобальна установка, gulp шукає локально встановлену глотку, на яку передає управління. Тому глобальна установка gulp вимагає локальної установки gulp для роботи. Відповідь вище все ще стоїть. Локальні встановлення завжди переважні перед глобальними.


3
Так, але що, коли у вас немає доступу до Інтернету? Як можна використовувати gulp, якщо він не встановлений глобально?
ІГРАЧ

3
@IGRACH Вищеописаний сценарій не використовує підключення до Інтернету. Якщо ви хочете зробити те саме, не використовуючи поле сценарію в package.json, тоді використовуйте ./node_modules/.bin/gulp.
квіте

1
Я визначив псевдоніми для, gulpі coffeeтому команди працюють з мого кореня проекту вузла (наприклад, alias gulp="node_modules/.bin/gulp"). Таким чином, команди зручні для використання, якщо це потрібно, і глобальні / локальні конфлікти версій не виникають.
vesse

Дякую @qubyte! Вважаю, що встановити його локально - це взагалі хороша практика. У мене є ще одне запитання, тож сподіваюся, ви зможете допомогти мені прояснити свою думку. Я спробував встановити його глобально, як запропонував документ Gulp, не встановлюючи його локально. Тож коли я намагаюся запустити gulp, воно дає мені таке повідомлення про помилку Local gulp not found in .... Наскільки я розумію, спочатку слід переглянути локальні модулі node_, а якщо їх не знайти, то слід вивчити глобально встановлені модулі, чи не так? Дякую!
yeelan

1
Додано доповнення. Сподіваємось, що це охоплює дивацтво ковтка.
квіте

82

TLDR; Ось чому :

Причина цього працює в тому, що gulpнамагається запустити gulpfile.jsвашу локально встановлену версію gulp, дивіться тут . Звідси причина глобальної та локальної установки глота.

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

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


1
~ / bin - це конвенція Unix для бінарних файлів користувача, а в PATH за замовчуванням для багатьох ОС. gulp повинен мати можливість зв'язати звідти свій двійковий код.
mikemaccana

2
Іншими словами, ваш глобально встановлений gulpпакет необхідний для того, щоб ввести node_modules/.bin/gulpшлях. Зберігання дешево, але викидання МБ для імітації симпосилання - це чиста неохайність ІМО.
ntd

79

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

npm link gulp

1
Я знаю, що найкраще використовувати локальну інсталяцію, але можуть бути випадки, коли ви просто не можете її встановити або просто не хочете (уявіть, що ваш виділений сервер CI має gulp глобально встановлений, і ви перевстановлюєте його на кожній комісії) . У всякому разі, +1 для згадки npm link.
gion_13

1
Я бачу, що ви там робили. Це розумно.
заглиблення

Це не намагається відповісти на питання
mikemaccana

1
Ні, це просто визнає недійсним.
Берислав Лопак

67

Питання " Чому нам потрібно встановлювати gulp глобально та локально? " Можна розділити на наступні два питання:

  1. Чому мені потрібно встановлювати gulp локально, якщо я вже встановив його глобально?

  2. Чому мені потрібно встановлювати gulp глобально, якщо я вже встановив його локально?

Декілька інших дали відмінні відповіді на тези тез поодиноко, але я вважав, що було б корисно консолідувати інформацію в єдиній відповіді.

Чому мені потрібно встановлювати gulp локально, якщо я вже встановив його глобально?

Обґрунтування установки локальної глотки складається з декількох причин:

  1. Включення залежностей вашого проекту на локальному рівні забезпечує версію gulp (або інших залежностей), якою користувався оригінально призначений варіант.
  2. Node не враховує глобальні модулі за замовчуванням при використанні requ () (який потрібно включити gulp у свій сценарій). Зрештою, це тому, що шлях до глобальних модулів не доданий до NODE_PATH за замовчуванням.
  3. За даними команди розробників Node, локальні модулі завантажуються швидше. Я не можу сказати, чому це так, але це, здається, буде більш актуальним для використання вузла у виробництві (тобто залежності часу виконання), ніж у розвитку (тобто, залежно від розробки). Я вважаю, що це законна причина, оскільки деякі можуть потурбуватися про те, яка незначна перевага у швидкості буде завантажена локальними та глобальними модулями, але сміливо піднімайте брову з цієї причини.

Чому мені потрібно встановлювати gulp глобально, якщо я вже встановив його локально?

  1. Обґрунтуванням установки gulp в усьому світі - це лише зручність автоматичного пошуку виконуваних файлів gulp у межах вашого системного шляху.

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

Зрештою, я вважаю, що має сенс мати можливість використання глобальних модулів, щоб не дублювати встановлення загальних інструментів у всіх ваших проектах, особливо у випадку таких інструментів розвитку, як grunt, gulp, jshint тощо. На жаль, це здається, ти закінчишся трохи боротися з інструментами, коли йдеш проти зерна.


7
+1 за те, що є першою людиною у всьому Інтернеті, яка зазначила, що на питання є два моменти. Більшість усіх усюди просто відповідають "Чому мені потрібно встановлювати глоп глобально, якщо я вже встановив його локально?" коли те, що я хотів дізнатися, було "Чому мені потрібно встановлювати gulp локально, якщо я вже встановив його в усьому світі?".
Nathan JB

10
Той факт, що це питання потребує такого ґрунтовного пояснення, означає, що це просто не дуже логічний спосіб роботи. Встановлення одного і того ж інструменту для кожного проекту не повинно бути необхідним.
Кокодоко

4
Ваша відповідь така гарна неемоційна. У моїх було б 80% присяг, оскільки це здається дурним ******* дурним. З точки зору інструментарію місцева теорія установки, мабуть, вірна, але з точки зору ОС та з точки зору менеджерів пакетів це настільки шалено, що я не можу знайти слова для цього. Які препарати приймають хлопці з НПМ / глоткою?!? Якщо хтось не погоджується, будь ласка, прочитайте, як менеджер системних пакетів, як dpkg, yum, pacman і co. робота.
JepZ

2
@JepZ, але тільки глотком є ​​надзвичайно дивно, але нічого у вузлі чи npm не змушує цього робити. І зберігати конкретні версії gulp в проекті має сенс лише, якщо хлопці gulp регулярно ламають версії патчів або щось інше, інші інструменти побудови зазвичай є глобальною установкою. Але ах добре. Просто тут для присяги.
Стофф

2
Це справді не проблема, оскільки спільнота перейшла до простого використання пряжі :)
Дерек Грір

8

Технічно вам не потрібно встановлювати його у всьому світі, якщо node_modulesпапка у вашій локальній установці знаходиться у вашій PATH. Як правило, це не дуже гарна ідея.

Крім того, якщо npm testпосилання, gulpто ви можете просто набрати, npm testі він запустить локальний глот.

Я ніколи не встановлював глоток у всьому світі - я думаю, що це погана форма.


3
Краще підходити, ніж ставити його на свій шлях, - використовувати сценарії NPM
Jay

2

Я не впевнений, чи була наша проблема безпосередньо пов’язана з встановленням gulp лише локально. Але нам довелося встановити купу залежностей самостійно. Це призводить до створення "величезного" package.json, і ми не впевнені, чи дійсно чудова ідея встановити gulp лише локально. Нам довелося це зробити через наше будівельне середовище. Але я б не рекомендував встановлювати gulp не в усьому світі, якщо це абсолютно не потрібно. Ми стикалися з подібними проблемами, як описано в наступному дописі до блогу

Жодна з цих проблем не виникає у будь-якого з наших розробників на своїх локальних машинах, оскільки всі вони встановили глофти в усьому світі. У системі збирання у нас були описані проблеми. Якщо хтось зацікавлений, я міг би заглибитись у цю проблему. Але зараз я просто хотів зазначити, що це непростий шлях до встановлення gulp лише локально.


Так, будь ласка, заглибтеся в цю проблему.
kenorb

1

Тільки тому, що я тут не бачив, якщо ви перебуваєте на MacOS або Linux, я пропоную вам додати це до свого PATH (у вашому bashrc тощо):

node_modules/.bin

При такому відносному введенні шляху, якщо ви сидите в кореневій папці будь-якого проекту вузла, ви можете запустити будь-який інструмент командного рядка (eslint, gulp, тощо. Тощо), не турбуючись про "глобальні установки" npm runтощо.

Після цього я ніколи не встановлював модуль у всьому світі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.