Монолитное репо и несколько папок 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