Рабочие области NPM 7 — как установить новый пакет в рабочую область?

Если у меня есть рабочее пространство NPM 7, например:

root
   - submodule0
   - submodule1
   - submodule2

и я перехожу в каталог submodule0 и запускаю npm i somepackage кажется, что «ломается» рабочая область, создавая новый package-lock.json в каталоге submodule0 и устанавливая все зависимости там. Другими словами, он просто выполняет старое поведение, существовавшее до того, как я создал рабочее пространство. Я надеялся на команду, похожую на lerna, где я смогу установить новый пакет в submodule0 из корня. Что-то вроде:

npm i somepackage --scope submodule0

Пока что единственный обходной путь, который я могу найти, — это отредактировать файл submodule0 package.json и добавить somepackage вручную. Затем запустите npm i из корня. Очевидно, это не идеально, потому что мне нужно найти @latest версию, перейти в подкаталог, открыть package.json и т. д. и т. д., а не просто ввести одну строку в корне.

У меня такой же вопрос

mesqueeb 29.01.2021 05:08

Вы пытались перейти в корень рабочей области и выполнить обновление npm?

EnterTheNameHere Bohemian 31.01.2021 13:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
41
2
33 075
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я также озадачен тем, почему рабочие области npm были выпущены без этой функции.

Мой текущий обходной путь использует пакет add-dependencies, который добавляет зависимости к объявленному файлу package.json, пропуская процесс установки.

npm i add-dependencies -g

Затем с верхнего уровня монорепозитория вы можете запустить:

npx add-dependencies ./submodule0/package.json somepackage && npm i

Надеюсь, скоро к --workspace будет добавлен аргумент npm i, чтобы избежать этой чепухи.

Это действительно полезное предложение. Я думаю, что с помощью этого я смогу свести его к одному скрипту npm в корне (хотя мне, возможно, придется использовать JS, чтобы сделать его независимым от ОС). Если я это сделаю, я вернусь и включу это сюда.

Dave Welling 11.01.2021 15:09

Добавлять только в package.json

Вы можете использовать это для установки пакета только в package.json (вам не нужны внешние зависимости)

npm i --prefix packages/test --save --package-lock-only --no-package-lock express

за которым следует npm i, чтобы установить указанную зависимость в корневой монорепозиторий node_modules

Лерна

Также можно использовать lerna, чтобы использовать имя рабочей области для установки зависимости в

package.json

{
  "name": "mono",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     "wsi": "function workspaceinstall() { ( scope=$1; shift; lerna exec --scope \"$scope\" -- npm install --package-lock-only --no-package-lock \"$@\") }; workspaceinstall"
  },
  "author": "",
  "license": "ISC",
  "workspaces": {
    "packages": [
      "packages/**"
    ]
  }
}

lerna.json

{
  "version": "1.0.0",
  "npmClient": "npm",
  "packages": ["packages/**"]
}

npm run wsi [workspace name] [dependency name to install]
npm run wsi @workspace/test express
npm run wsi @workspace/test express --save-prod 
npm run wsi @workspace/test @types/express --save-dev 

Сценарий wsi изменяет только package.json для указанного имени рабочей области, чтобы фактически установить зависимости, которые вам нужно запустить npm i

Пожалуйста, обратитесь к ответу mattwad выше, если у вас есть NPM v7.14.0 или выше.

Оригинальный ответ

Мне не очень понравились предложения, но я объединил их все, чтобы использовать его в скрипте npm без каких-либо зависимостей:

{
   "add": "npm install --package-lock-only --no-package-lock --prefix",
   "postadd": "npm install"
}

Это можно использовать следующим образом: npm run add -- submodule0 somepackage

В моем случае, похожем на ваш, я удалил все зависимости из всех внутренних проектов, удалил также package-lock.json и установил все в корень.

/
  node_modules
  package.json >> all dependencies
  package-lock.json >> the only lock file that exists in the repo
  /packages
    /A
      package.json >> no dependencies
      -- no package-lock.json
    /B
      package.json >> no dependencies
      -- no package-lock.json
    /C
      package.json >> no dependencies
      -- no package-lock.json

Таким образом, папка node_modules находится ТОЛЬКО в корне, а также файл package-lock.json находится в корне.

Если бы я разрешил каждому проекту иметь собственный package-lock.json, я начал бы видеть ошибки установки и выполнения (потому что каждый проект мог иметь свои собственные node_modules и свою собственную версию зависимости).

Это лучший способ, который я вижу, что это работает.

Не возражаете, если я спрошу, для чего вы используете рабочие пространства, если делаете это? То, что вы предложили, сработает, но если я что-то не пропустил, мне кажется, что вы относитесь к рабочим пространствам как к нерабочим?

user56reinstatemonica8 19.04.2021 12:57

конечно, C — это общий пакет, в котором у меня есть все мои классы обслуживания, а A и B — это API, которые имеют конфигурацию маршрутизатора конечной точки koa, которая повторно использует службы, написанные на C. Раньше мне приходилось каждый раз переиздавать C в частный npm для установки в A и B. Теперь я могу обратиться к C без какой-либо установки.

Kat Lim Ruiz 19.04.2021 19:50

После попытки использовать npm install с параметрами --prefix --save --package-lock-only --no-package-lock npm всегда выдает ошибку E404 - Not Found для моих собственных пакетов монорепозитория, которые еще не опубликованы в реестре. Поэтому даже при попытке установить внешние пакеты это не удается из-за моих текущих зависимостей в package.json.

Чтобы обойти эту проблему, я остановился на сочетании предыдущих предложений:

"scripts": {
    "add": "add-dependencies $npm_config_scope/package.json",
    "postadd": "npm i",
},
"devDependencies": {
    "add-dependencies": "^1.1.0"
},

Тогда я могу сделать:

npm run add --scope=packages/app express
npm run add --scope=packages/core eslint jest -D

Это отлично работает для установки внешних пакетов. Чтобы установить свои собственные пакеты, которые находятся внутри монорепозитория, мне все равно придется вручную редактировать package.json, иначе я получу package not found error.

Было бы лучше, если бы вы могли добавить какое-то объяснение того, как и почему это работает, а другие нет.

murrayju 24.04.2021 01:59
Ответ принят как подходящий

Поддержка рабочей области для npm install и npm uninstall была добавлена ​​в npm v7.14.0. Теперь вы можете просто сделать:

npm i somepackage --workspace=submodule0

Удаление модулей было самой большой проблемой, так что это действительно интересно. Команда npm, похоже, медленно добавляет поддержку команд одну за другой. Следите за обновлениями здесь: https://github.com/npm/cli/blob/latest/CHANGELOG.md.

Мой проект был настроен на использование пряжи, и yarn add package-name работал

Mahesh 27.09.2022 03:30

и для нескольких: npm i somepackage --workspace=submodule0 --workspace=submodile1.

dang 13.12.2022 11:50

а как насчет всех рабочих мест?

dang 13.12.2022 11:50

можно ли одновременно установить пакеты workspace + root?

Filip Seman 09.01.2023 11:27

я считаю, что это поведение было исправлено в npm 8.5.0.

мне удалось установить пакет в рабочей области submodule0 из каталога submodule0/ без создания пакетов package-lock.json и node_modules/ в том же каталоге.

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