Как мне установить зависимости для одного пакета при использовании рабочих пространств npm?
Используя рабочие области npm, у меня есть такая структура папок
+-- package.json
+-- package-lock.json
+-- client
| `-- package.json
+-- shared
| `-- package.json
`-- server
`-- package.json
Обычно при создании производственной сборки для приложения nodejs я запускал, а затем копировал в артефакт сборки. Я не знаю, как делать что-то подобное при работе с рабочими областями.
Если я сбегу
npm ci --only=production --workspace server
он разделяет зависимости между
./node_modules
и
./server/node_modules
. Может быть, мне следует скопировать (объединить?) Оба в артефакт сборки?
Другой вариант - скопировать
./package-lock.json
и
./server/package.json
в новый каталог и запустите
npm ci --only=production
. Кажется, это работает, но я недостаточно знаю о npm, чтобы понять, хорошая ли это идея.
Требования:
-
node_modules
должен включать только производственные зависимости для выбранного пакета - Версии зависимости должны определяться
package-lock.json
.
2 ответа
Раскол междуnode_modules
и это связано с подъемом. Если бы существовал способ отключить подъем, то все зависимостиserver
будет установлен наserver/node_modules
. Однако текущие версии npm не предоставляют возможности отключить подъем рабочих областей.
Обсуждение добавления такой функции обсуждается в следующих выпусках:
Я бы использовал комбинациюinstall
варианты конфигурации.
Используя Node v18.16.0 и npm v9.7.2, вот результат:npm install --help
(для правильного исключения зависимостей разработки требуется npm >= v9.7.2 ):
$ npm install --help
Install a package
Usage:
npm install [<package-spec> ...]
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global]
[--install-strategy <hoisted|nested|shallow|linked>] [--legacy-bundling]
[--global-style] [--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]]
[--strict-peer-deps] [--no-package-lock] [--foreground-scripts]
[--ignore-scripts] [--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
[-ws|--workspaces] [--include-workspace-root] [--install-links]
aliases: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall
Run "npm help install" for more info
В данном случае я бы предложил сочетание
install-strategy
(nested
)omit
(dev
)workspace
()
Итак, из корня рабочих пространств:
npm install --install-strategy=nested --omit=dev --workspace=server
Вам может понадобиться или не понадобиться-install-strategy
.
Это должно оставить каталог в корне рабочих пространств только с зависимостями, определенными в файле package.json рабочего пространства с теми, которые определены вdevDependencies
опущен. Вы также можете--omit=peer
удалятьpeerDependencies
изserver
рабочее место тоже.
ПРИМЕЧАНИЕ . В зависимости от вашего графа зависимостей все равно может остаться несколькоnode_modules
каталоги, которые потребовали бы объединения для создания артефакта, т.е.--install-strategy=nested
Похоже, что он работает неправильно для рабочих пространств npm . Однако установленные deps должны быть правильно изолированы от рабочей области, переданной в--workspace
. Вот пример репозитория, показывающий, как можно объединить эти зависимости.