Як я можу змусити кілька проектів спільно використовувати каталог node_modules?


95

Кожного разу, коли я роблю проекти, мені доводиться завантажувати всі залежності вузлових модулів. Чи не копіюючи node_modules, чи можна взагалі поділитися центральними node_modules у декількох проектах?

як і наступні, я повинен запускати багато команд щоразу ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
Ви можете встановити їх у загальний батьківський каталог, якщо він є. Вузол буде ходити по каталогах, шукаючи requireмодуль d. В іншому випадку ні, немає офіційної "центральної" node_modulesпапки для використання require().
Джонатан Лоновський

Ви можете глобально встановити ці пакети, використовуючи глобальний прапор. Тому вам не потрібно запускати команди встановлення щоразу. npm install <npm_package_name> -g
Саба Хасан,

Відповіді:


90

Ви абсолютно можете поділитися каталогом node_modules серед проектів.

З документації вузла :

Якщо ідентифікатор модуля, переданий в require (), не є власним модулем і не починається з '/', '../' або './', тоді вузол починається з батьківського каталогу поточного модуля і додає / node_modules і намагається завантажити модуль з цього місця.

Якщо його там не знайти, він переміщується до батьківського каталогу і так далі, доки не буде досягнутий кореневий каталог файлової системи.

Наприклад, якщо файл у '/home/ry/projects/foo.js' називається require ('bar.js'), то вузол буде виглядати в наступних місцях у такому порядку:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Тож просто помістіть папку node_modules всередину каталогу проектів і вставте будь-які потрібні вам модулі. Просто вимагайте їх, як звичайні. Коли вузол не знаходить каталог node_modules у папці проекту, він автоматично перевірить батьківську папку. Тож зробіть структуру каталогів такою:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Ось так, навіть залежності вашого підпроекту можуть спиратися на ваше головне сховище node_modules.

Один недолік, коли ви робите це таким чином, - вам доведеться створювати файл package.json вручну (якщо хтось не знає способу автоматизувати це за допомогою grunt або чогось іншого). Коли ви встановлюєте свої пакунки та додаєте аргумент --save arg до npm installкоманди, він автоматично додає його до розділу залежностей або вашого package.json, що зручно.


3
Чому це не прийнято як відповідь? Подальше запитання до @tpie, якщо хтось структурує такий проект, як ви запропонували, як створити пакет.json для встановлення з батьківського сховища модулів.
diehell

@diehell Тож здається, що це "все або нічого". Якщо всі або залежності живуть у батьківському каталозі, а в CWD немає каталогу node_modules, тоді npm перевірить батьківський і встановить його там, якщо знайде. Якщо ви помістите папку node_modules в каталог, він буде там встановлений.
tpie

4
Я не бачу, як спільний доступ до node_modules може обробляти різні версії пакетів, пакети в node_modules не мають версій, на відміну від кешу npm в c: \ users (Windows), чи хтось стикався з цим?
кібергест

Як я можу змінити свою парадигму під час написання сценаріїв npm та файлів package.json?
Меддокс,

18

Я знайшов фокус, просто погляньте на символічні посилання (символічні посилання) в Windows або Linux , він працює так само, як ярлики, але більш потужний.

Просто вам потрібно зробити Junctionдля вашої node_modulesпапки де завгодно. Стик - це не що інше, як ярлик до вашої початкової папки node_modules. Створіть його всередині папки проекту, де б були створені фактичні node_modules, якби використовувались npm install.

Для цього вам потрібна принаймні одна node_modulesреальна папка, а потім зробіть перехід до неї в інших проектах.

У Windows ви можете скористатися командним рядком або застосувати програму. Використання командного рядка дає вам трохи більше контролю, а використання програми простіше, я пропоную Розширення оболонки посилання .


1
Я кд в цільову директорію, виконайте наступну команду: mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Моя команда використовує цей метод вже деякий час. Хоча я справді зневажаю відсутність node_modulesу самій папці проекту, це працює. Просто потрібно пам’ятати про перегляд фактичної node_modulesпапки перед тим, як встановлювати щось нове: P
Ендрю Красвелл

Здається, цей метод для мене не працює. Коли я використовую або символічні, або перехрестя, я отримую таку помилку з node-sass: Помилка побудови модуля: "Помилка: Модуль не зареєструвався самостійно", а помилка містить додаткові відомості, вказуючи каталог, де існує "спільний" каталог node_modules. Будь-які ідеї?
фліп-код

1
Як уникнути обрізання залежностей під час запуску npm installв будь-якій із "підключених" програм?
Qwerty

1
але коли я запускаю npm install <new-package>всі пакунки, що не входять у ваш поточний проект package.json, видаляються.
Рохіт Каушаль

17

Спробуйте pnpm замість npm.

pnpm використовує жорсткі посилання та символьні посилання, щоб зберегти одну версію модуля лише один раз на диску.

Встановити за допомогою:

npm install -g pnpm

Для оновлення існуючих установок (і підкаталогів) використовуйте:

pnpm recursive install

8

Головний каталог повинен виглядати так

node_modules
Project 1
Project 2
Project 3
Project 4

просто відкрийте файл Project 1/.angular-cli.json

змінити схему

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

до

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

і не забудьте створити node_modulesпорожню папку всередині каталогу проекту


Ви - мій герой. Я витратив на це тиждень . Дуже дякую!!
Eliezer Berlin

5

Переглядаючи деякі статті, здається, що Lerna - це хороший інструмент для управління кількома проектами в одному каталозі ( monorepo). Він підтримує спільний доступ до модулів, не дублюючи цілі пакети у кожній папці та команди для їх встановлення в декількох проектах.

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


0

Припустимо, що маючи єдиний node_modules, він повинен містити всі пакети для всіх додатків. таким чином ваші додатки також матимуть спільний доступ до більшості унікальних записів package.json (просто ім'я має змінитися)

моя ідея полягала б у тому, щоб мати однокореневий та декілька рівнів src, як показано нижче

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

єдиною проблемою, з якою ви можете зіткнутися, було б створення резервної копії json (або tsconfig) для будь-якої програми та відновлення їх під час роботи над нею або налаштування сценаріїв запуску для обслуговування будь-якої програми


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