Вопрос или проблема
У меня есть пакет A в частном реестре. Я добавил его как зависимость к публичному пакету B. Пакет B является зависимостью пакета C. Но проблема в том, что npm требует доступа к A из пакета C. Как я могу собрать пакет B таким образом, чтобы он был полностью публичным?
Пакет A должен оставаться приватным.
Ответ или решение
Для того чтобы опубликовать публичный пакет B с приватными зависимостями (например, пакетом A), и при этом сделать так, чтобы доступ к пакету A не требовался при установке пакета C, вам нужно следовать нескольким шагам. Ниже приведены рекомендации по успешной реализации этой задачи.
Шаги для публикации публичного пакета с приватными зависимостями
-
Использование
peerDependencies
:- Если пакет A необходим только для разработки или не является обязательным для использования пакета B в обычных сценариях, вы можете переместить зависимость A в
peerDependencies
в файлеpackage.json
вашего пакета B. Это будет означать, что пользователи, которые устанавливают пакет B, должны самостоятельно установить пакет A, если он им нужен. Например:{ "name": "package-B", "version": "1.0.0", "peerDependencies": { "package-A": "^1.0.0" } }
- Таким образом, при установке пакета C, пакет A не будет автоматически загружаться, и доступ к нему не будет требоваться.
- Если пакет A необходим только для разработки или не является обязательным для использования пакета B в обычных сценариях, вы можете переместить зависимость A в
-
Создание обертки:
- Если пакет A действительно необходим для работы пакета B и не может быть сделан опциональным, вы можете создать обертку для пакета A, которая будет выступать в качестве интерфейса. Этот слой может скрывать детали реализации пакета A, таким образом, пакет B будет работать корректно, но не будет являться прямой зависимостью.
-
Монорепозиторий:
- Если ваш проект достаточно большой, рассмотрите возможность использования монорепозитория с инструментами вроде Lerna или Yarn Workspaces. Это позволяет управлять несколькими пакетами и их зависимостями более эффективно. В этом случае, вы можете настроить приватный пакет в рамках одного репозитория, и он не будет опубликован публично.
-
Скрипты сборки:
- Убедитесь, что в процессе сборки пакета B вы исключаете пакеты, которые находятся в приватных репозиториях. Вам может потребоваться создать собственный скрипт сборки, который будет удалять ссылки на приватные зависимости перед публикацией.
- Тестирование:
- Перед публикацией пакета B на npm, убедитесь, что вы протестировали установку пакета C без доступа к пакету A. Проверьте, что никаких ошибок не возникает и все необходимые функции работают корректно.
Публикация пакета
После выполнения всех вышеперечисленных шагов, вы можете опубликовать пакет B на npm:
-
Войдите в свой npm аккаунт:
npm login
- Опубликуйте пакет B:
npm publish --access public
Заключение
Таким образом, для успешной публикации публичного пакета с приватными зависимостями необходимо правильно управлять зависимостями, использовать peerDependencies
и тщательно тестировать пакет перед его публикацией. Следуя этим рекомендациям, вы сможете сохранить пакет A приватным, обеспечивая при этом доступ к пакету B.