Можно ли разбить список зависимостей (опубликованного) пакета, создав новые (не опубликованные) "sub" -пакеты?
Я поддерживаю библиотеку JavaScript, которая публикуется в реестре npm и имеет множество зависимостей. Сложно отслеживать, какая часть кода зависит от внешних пакетов.
К сожалению, ни одна из lerna
, yarn
рабочих пространств, npm link
или npm
локальная декларация декларации о зависимости пути. (Я объясню, почему после примера.)
Я хочу разбить список dependencies
, объявленный в package.json
, извлекая некоторые из зависимостей в новые "подпакеты".
Итак, вместо следующего списка зависимостей
// ~/code/example-lib/package.json
{
"name": "example-lib",
"dependencies": {
"lodash": "*",
"request": "*",
"chalk": "*",
"bluebird": "*",
"mz": "*",
"moment": "*",
"socket.io": "*",
"socket.io-client": "*",
"react": "*",
"react-dom": "*"
}
}
Я хочу извлечь некоторые из зависимостей в новый локальный пакет example-lib-subpackage
. С локальным я имею в виду, что example-lib-subpackage
предназначен только для потребления example-lib
.
example-lib-subpackage
список зависимостей будет:
// ~/code/example-lib/packages/example-lib-subpackage/package.json
{
"name": "example-lib-subpackage",
"dependencies": {
"lodash": "*",
"request": "*",
"bluebird": "*",
"moment": "*",
"socket.io-client": "*",
"react": "*",
"react-dom": "*"
}
}
и example-lib
список зависимостей затем будет значительно уменьшен до:
// ~/code/example-lib/package.json
{
"name": "example-lib",
"dependencies": {
"chalk": "*",
"example-lib-subpackage": "./packages/example-lib-subpackage",
"mz": "*",
"socket.io": "*"
}
}
Обратите внимание, что теперь example-lib
зависит от локального пакета example-lib-subpackage
;
...
"name": "example-lib",
"dependencies": {
...
"example-lib-subpackage": "./packages/example-lib-subpackage",
...
Кто-нибудь достиг этого? Это было бы супер удобно.
Обратите внимание, что рабочие области lerna
и yarn
имеют только помощь, если вы в порядке публикуете локальные пакеты в реестре npm. Но в моем случае публикация локального пакета example-lib-subpackage
в реестре npm не имеет смысла.
Кроме того, функция привязки npm link
и npm
локального пути работает только для пакетов, которые не опубликованы, но example-lib
должен быть включен в реестр npm.
Локальные пути [...] не должны использоваться при публикации пакетов в общий реестр.
Цитата из https://docs.npmjs.com/files/package.json#local-paths
Ответы
Ответ 1
Так как package.json
- это просто объект JS, вы можете расширить его до публикации в NPM.
Вкл prepublish
:
- версия пакета обновления
- удалить package.json local
example-lib-subpackage
зависимость
- расширить
example-lib
зависимости с объявленным в
example-lib-subpackage
- необязательно выполните несколько тестов по обновленному
package.json
- опубликовать
- вернуть исходный объект зависимостей
- выполнить новую версию
PouchDb следует смутно подобным подходом, описанным подробнее здесь и здесь.
Ответ 2
Я думал, что вы можете использовать инструмент построения для поддержки нескольких package.json
и скомпилировать их до реального, но вы будете сражаться с платформой целиком. У вас должен быть собственный CLI для установки, и это будет беспорядок.
Вы говорите:
Обратите внимание, что рабочие области lerna
и yarn
работают только в том случае, если вы в порядке с публикацией локальных пакетов в реестре npm. Но в моем случае публикация локального пакета example-lib-subpackage
в реестре npm не имеет смысла.
Я не думаю, что вы найдете решение, которое имеет прекрасный смысл (если вы идете вниз по пути, чтобы сделать совершенно нестандартные вещи с npm), и мне любопытно, почему вы устраняете разрыв example-lib-subpackage
в свое собственное репо - это похоже на очевидное решение.