Могу ли я запустить частный репозиторий npm без репликации публичного репозитория?
Я пишу несколько фрагментов кода (для внутреннего использования) с помощью node.js и хочу хранить модули (упакованные для npm) в репозитории пакетов для каждого дистрибутива на различные машины, которые они будут установлен на.
В идеале я бы хотел найти решение, подобное репозиториям Debian apt, в которых я могу запустить сервер частных репозиториев и настроить npm на использование списка репозиториев для установки (при установке "foo", если известно "foo" моим личным сервером установите его там, иначе установите его с общедоступного сервера).
Однако, похоже, что ключ конфигурации npm registry
принимает только один URL.
Есть ли способ достичь того, чего я хочу?
Ближе всего я смог найти:
- Зеркальное отображение публичного репозитория локально и добавление моих пакетов поверх него... но я не хочу, чтобы этот объем данных (2.5G и все еще загружаемый) был реплицирован на AWS.
- Хостинг всех моих пакетов в репозиториях git и установка оттуда (что более сложно).
- Хостинг статических пакетов по HTTP (насколько я могу судить, это помешало бы мне автоматически получать "последнюю версию". Я полагаю, что могу что-то делать с символическими ссылками, но это все же менее гибко, чем git, требует полные URL-адреса (которые необходимо обновлять) и не предоставляют поисковый репозиторий.
Ответы
Ответ 1
Я просто задал это для своей работы. Вот что я сделал:
-
Установить пустой реестр NPM. Я выполнил инструкции из этой версии npmjs.org, которая добавляет большую улучшенную документацию.
-
Настройка Kappa. Я использовал Kappa, отличный прокси-сервер npm от Paypal. (Я предполагаю, что у них очень похожий случай использования для большинства людей, которые хотят получить частный репозиторий, это именно то, что я хотел).
-
Настройка npm_lazy (необязательно): мне нужен хороший кэш часто используемых пакетов в случае, когда npmjs.org пошел, поэтому я добавил npm_lazy перед всем, как слой кеширования.
Целая вещь заняла два дня (иш), чтобы встать и бежать. В качестве побочного примечания, если вы беспокоитесь о том, что люди случайно нажали на публичный реестр, я рекомендую добавить это к вашему package.json
:
"publishConfig": { "registry": "http://my-registry.example.com" },
Это действительно немного паранойя; как только вы настроите свой npm на ваш экземпляр Kappa/npm_lazy, Kappa обрабатывает публикацию в вашем частном репозитории для вас.
Примечание. Kappa будет публиковать только каждый первый репозиторий в конфигурации. Если вам нужно публиковать как ваш частный реестр, так и общественность, вам нужно будет разработать собственное решение.
Ответ 2
В вашем пакете .json вы можете использовать любой url, который указывает на действительный упакованный модуль npm. Я использую s3 с именем ведра, которое трудно догадаться.
npm pack
s3cmd put *.tgz s3://path-to-your bucket
S3 - просто пример, вы можете использовать любое среднее значение, которое может помещать файл на веб-сервер, его можно даже защитить с помощью базового auth.
Ответ 3
Я считаю, что проект Paypal Kappa подойдет вам.
Вот статья, описывающая проект Paypal Kraken и то, как Kappa подходит.
Я понимаю, что он не был доступен во время вопроса Квентина, но, возможно, это будет полезно для других, которые приходят сюда.
Ответ 4
npm-registry-client Проблема GitHub № 42 перечисляет несколько способов создания вашего собственного зеркала репозитория. а именно:
В целом мне кажется, что вы можете получить наилучшие ответы, просмотрев проблемы в репозиториях, принадлежащих https://github.com/npm, или задав свой вопрос там
Ответ 5
Основываясь только на прослушивании недавнего эпизода NodeUp (# 37?), я думаю, вы можете взглянуть на irisnpm. Из того, что я помню, это сервис, который дает вам объединенный набор открытых модулей и ваших собственных частных модулей.
Ответ 6
Как предложил Доминик Барнс, мы можем реплицировать только документы _design
(схемы таблиц CouchDB)
Как копировать только документы проекта?
Однако необходимо проверить, нужны ли некоторые данные.
Ответ 7
Вы можете реплицировать нужные вам модули, а затем написать прокси-сервер, который ищет модуль в вашей репликации. Если модуль не существует, он может передать запрос в NPM и вернуть результат оттуда.