Если у меня есть рабочее пространство 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 и т. д. и т. д., а не просто ввести одну строку в корне.
Вы пытались перейти в корень рабочей области и выполнить обновление npm?
Я также озадачен тем, почему рабочие области npm были выпущены без этой функции.
Мой текущий обходной путь использует пакет add-dependencies, который добавляет зависимости к объявленному файлу package.json, пропуская процесс установки.
npm i add-dependencies -g
Затем с верхнего уровня монорепозитория вы можете запустить:
npx add-dependencies ./submodule0/package.json somepackage && npm i
Надеюсь, скоро к --workspace
будет добавлен аргумент npm i
, чтобы избежать этой чепухи.
Это действительно полезное предложение. Я думаю, что с помощью этого я смогу свести его к одному скрипту npm в корне (хотя мне, возможно, придется использовать JS, чтобы сделать его независимым от ОС). Если я это сделаю, я вернусь и включу это сюда.
Вы можете использовать это для установки пакета только в 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 и свою собственную версию зависимости).
Это лучший способ, который я вижу, что это работает.
Не возражаете, если я спрошу, для чего вы используете рабочие пространства, если делаете это? То, что вы предложили, сработает, но если я что-то не пропустил, мне кажется, что вы относитесь к рабочим пространствам как к нерабочим?
конечно, C — это общий пакет, в котором у меня есть все мои классы обслуживания, а A и B — это API, которые имеют конфигурацию маршрутизатора конечной точки koa, которая повторно использует службы, написанные на C. Раньше мне приходилось каждый раз переиздавать C в частный npm для установки в A и B. Теперь я могу обратиться к C без какой-либо установки.
После попытки использовать 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
.
Было бы лучше, если бы вы могли добавить какое-то объяснение того, как и почему это работает, а другие нет.
Поддержка рабочей области для 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
работал
и для нескольких: npm i somepackage --workspace=submodule0 --workspace=submodile1.
а как насчет всех рабочих мест?
можно ли одновременно установить пакеты workspace + root?
я считаю, что это поведение было исправлено в npm 8.5.0.
мне удалось установить пакет в рабочей области submodule0
из каталога submodule0/
без создания пакетов package-lock.json
и node_modules/
в том же каталоге.
У меня такой же вопрос