Монолитное репо и несколько папок node_modules

У меня есть проект с использованием монолитных репозиториев. Каждый пакет имеет свой собственный файл package.json для управления зависимостями для указанного пакета. я использую lerna установить пакет во всех "подпакетах" нашего приложения monorepo.

Текущая структура проекта выглядит следующим образом

Проект / 
| package.json
| node_modules/
|- пакеты /
| - package1/ 
|--- package.json 
|--- node_modules/
|- package2/
|--- package.json
|--- node_modules/

Я ищу способ обобщения общих зависимостей в корневой папке node_modules, чтобы каждый пакет не извлекал свою собственную копию пакета узла при запуске lerna exec -- npm install но вместо этого используйте тот, который находится в корне монолитного репо, чтобы мы не устанавливали один и тот же пакет в несколько репо, следовательно, уменьшая размер проекта.

Я видел какое-то решение, в том числе создание символических ссылок между проектами, но это, похоже, не является точной наукой, поскольку поддержка символических ссылок сильно зависит от ОС. Кроме того, это не кажется поддерживаемым способом сделать это.

В настоящее время мы только в начале и после запуска lerna exec -- npm install проект уже стоит около 350 Мб на диске, и получение всего из npm занимает около 5 минут в первый раз. Поскольку проект будет расти со временем, это время также будет увеличиваться со временем...

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

3 ответа

Лерна недавно добавила --hoist вариант, который выглядит так, как будто он предоставляет именно то, что вы искали здесь. Он устанавливает внешние зависимости в корне репо, чтобы они были доступны для всех пакетов. Двоичные файлы связаны в зависимый пакет node_modules/.bin/ каталоги, поэтому они доступны для сценариев npm.

Он может быть передан в командной строке или добавлен в lerna.json для прочной конфигурации.

Документация доступна здесь: https://github.com/lerna/lerna

С августа 2017 года в Yarn включена функция Workspaces, которая делает именно это. Но что еще лучше, так это то, что Лерна может быть осведомлена и интегрирована с ней через --use-workspaces, Бег lerna bootstrap как обычно, будет обрабатывать все это автоматически.

Я рекомендую не использовать lerna совсем. Я думаю, что это ошибочная идея.

Вместо этого просто поместите отдельные модули в свои файлы и загрузите import mod1 from './modили т. д. или создать отдельные репозитории. Но не создавайте отдельные репозитории для каждого маленького модуля - просто вещи, которые вы или кто-то еще можете использовать повторно (то есть вы хотите опубликовать его, чтобы помочь другим людям).

Вы можете воспользоваться npm link, объем пакетов, список репозиториев github просто в package.json с dependencies:{"mod1":"myorg/mod1"} чтобы было проще иметь его в отдельном репо (при необходимости).

Особенно npm link должно упростить вещи. http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears

Другие вопросы по тегам