Как я могу сделать несколько проектов совместно используемыми каталогом 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
Вы можете установить их в общий родительский каталог, если он есть. Node будет просматривать каталоги в поисках 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 не находит каталог node_modules в папке вашего проекта, он автоматически проверяет родительскую папку. Итак, сделайте вашу структуру каталогов такой:

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

Таким образом, даже зависимости вашего подпроекта могут опираться на ваш основной репозиторий node_modules.

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

tpie
источник
3
Почему это не принято в качестве ответа? Дополнительный вопрос к @tpie: следует ли структурировать проект, как вы предложили, как создать package.json для установки из репозитория родительских модулей.
Diehell
@diehell Так что вроде "все или ничего". Если все или зависимости находятся в родительском каталоге и в CWD нет каталога node_modules, тогда npm проверит родительский каталог и установит его, если найдет его. Если вы поместите папку node_modules в каталог, он будет там установлен.
tpie 01
4
Я не понимаю, как совместное использование node_modules может обрабатывать разные версии пакетов, пакеты в node_modules не версируются, в отличие от npm-cache в c: \ users (Windows), кто-нибудь сталкивался с этим?
cyberguest
Как мне изменить свою парадигму при написании сценариев npm и файлов package.json?
Мэддокс
18

Я нашел трюк, просто взгляните на символические ссылки (символические ссылки) в Windows или Linux , он работает так же, как ярлыки, но более мощный.

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

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

В Windows вы можете использовать командную строку или приложение. Использование командной строки дает вам немного больше контроля, использовать приложение проще, я предлагаю расширение Link Shell .

Эймен Элькум
источник
1
Я кд в целевую директорию, выполните следующую команду: mklink /d node_modules (source dir)\node_modules.
ChrisTorng
1
Моя команда уже некоторое время использует этот метод. Хотя я очень сожалею, что node_modulesу меня нет самой папки проекта, это работает. Просто не забудьте перейти в настоящую node_modulesпапку перед установкой чего-либо нового: P
Эндрю Красвелл
Мне кажется, что этот метод не работает. Когда я использую символические символы или соединения, я получаю следующую ошибку с node-sass: Ошибка сборки модуля: «Ошибка: модуль не саморегистрировался», и ошибка содержит дополнительные сведения, указывающие каталог, в котором существует «общий» каталог node_modules. Любые идеи?
флипкод 05
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пустую папку в каталоге вашего проекта

Шахзад Серадж
источник
Ты мой герой. Я потратил на это неделю . Огромное спасибо!!
Элиэзер Берлин,
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) для любого приложения и восстанавливать их, когда вы работаете над ним, или настраивать сценарии запуска для обслуживания любого приложения

Фабио Геррацци
источник