node.js - update - ¿Puedo ejecutar un repositorio npm privado sin replicar el repositorio público?
npm version patch (7)
Estoy escribiendo una serie de códigos (para uso interno) usando node.js y quiero almacenar los módulos (empaquetados para npm) en un repositorio de paquetes para cada distribución en las diversas máquinas en las que se instalarán.
Idealmente, me gustaría una solución similar a los repositorios de Debian en los que puedo ejecutar un servidor de repositorio privado y configurar npm para usar una lista de repositorios desde los que instalar (Al instalar "foo", si mi fobo conoce "foo") servidor instálelo desde allí, de lo contrario instálelo desde el servidor público).
Sin embargo, parece que la clave de configuración de registry
npm solo acepta una sola URL.
¿Hay alguna manera de lograr lo que quiero?
Lo más cerca que he podido encontrar ha sido:
- Duplicar el repositorio público localmente y agregar mis paquetes a él ... pero no quiero que esa cantidad de datos (2.5G y todavía descargada) se replique en AWS.
- Alojando todos mis paquetes en repositorios git e instalándolos desde allí (lo cual es más una molestia).
- Alojando paquetes estáticos en HTTP (hasta donde puedo decir, esto me impediría obtener automáticamente "la última versión." Supongo que podría hacer algo con enlaces simbólicos, pero eso es aún menos flexible que git, requiere URL completas (que necesitan mantenerse actualizado), y no proporciona un repositorio de búsqueda.
Acabo de configurar esto para mi trabajo. Esto es lo que hice:
Configurar el registro NPM vacío : seguí las instrucciones de este fork de npmjs.org, que agrega mucha documentación mejorada .
Configurar Kappa : utilicé Kappa , un gran proxy npm de Paypal. (Supongo que tienen un caso de uso muy similar para la mayoría de las personas que quieren un repositorio privado; esto es exactamente lo que yo quería).
Configuración npm_lazy ( opcional ): quería un buen caché de paquetes utilizados con frecuencia en caso de que npmjs.org fallara, así que agregué npm_lazy al frente de todo, como una capa de almacenamiento en caché.
Todo tomó dos días (ish) para comenzar a funcionar. Como nota al margen, si le preocupa que las personas presionen el registro público por accidente, le recomiendo que agregue esto a su package.json
. package.json
:
"publishConfig": { "registry": "http://my-registry.example.com" },
Esto realmente es solo un poco de paranoia; una vez que configura su npm para que apunte a su instancia Kappa / npm_lazy, Kappa maneja la publicación en su repositorio privado por usted.
Nota: Kappa solo publicará en el primer repositorio en su configuración. Si necesita publicar tanto en su registro privado como en el público, tendrá que encontrar su propia solución.
Como sugirió Dominic Barnes, solo podemos replicar documentos de _design
(esquemas de tabla CouchDB)
¿Cómo replicar solo documentos de diseño?
Sin embargo, necesita verificar si se necesitan algunos datos.
Creo que el proyecto Kappa de Paypal se adaptaría a sus necesidades.
Aquí hay un artículo que describe el proyecto Kraken de Paypal y cómo encaja Kappa.
Entiendo que no estaba disponible en el momento de la pregunta de Quentin, pero quizás esto sea útil para otros que vienen aquí.
En su package.json, puede usar cualquier url que apunte a un módulo válido npm packed. Yo uso un s3 con un nombre de cubo que es difícil de adivinar.
npm pack
s3cmd put *.tgz s3://path-to-your bucket
S3 es solo un ejemplo, puedes usar cualquier medio que pueda colocar un archivo en un servidor web, incluso puede estar protegido mediante autenticación básica.
Podría replicar los módulos que necesita y luego escribir un servidor proxy que busque un módulo en su replicación. Si un módulo no existe, podría canalizar la solicitud a la NPM y devolver el resultado desde allí.
npm-registry-client número 42 de GitHub enumera varias formas de cómo crear su propio espejo repositorio. a saber:
- https://github.com/cnpm/cnpmjs.org
- https://github.com/rlidwka/sinopia
- https://github.com/davglass/registry-static
En general, me parece que puede obtener mejores respuestas buscando en los repositorios propiedad de https://github.com/npm o haciendo su pregunta allí