Як я можу змусити кілька проектів спільно використовувати каталог 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.