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