Как мне установить зависимости для одного пакета при использовании рабочих пространств 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, чтобы понять, хорошая ли это идея.

Требования:

  1. node_modules должен включать только производственные зависимости для выбранного пакета
  2. Версии зависимости должны определяться 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

В данном случае я бы предложил сочетание

Итак, из корня рабочих пространств:

      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. Вот пример репозитория, показывающий, как можно объединить эти зависимости.

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