Tengo una pregunta similar a esta , pero no la misma.
Me gustaría que el usuario de mi aplicación la instale con las dependencias necesarias para la forma en que le gustaría usarla. Entonces, por ejemplo, si quieren persistir en MongoDB, solo se instalarán las bibliotecas relacionadas con Mongo, pero si quieren persistir en Redis, solo se instalarán las bibliotecas relacionadas con Redis. No quiero hacer que descarguen e instalen bibliotecas que no usarán.
Sé que puedo hacerlo con fines de desarrollo devDependencies
, pero esto va más allá de eso. Como dice la respuesta en la pregunta anterior, esto está más estrechamente relacionado con setuptools
extras_require
los leiningen
perfiles de Python y Clojure . ¿Algo así en npm? Realmente siento que devDependencies
debería ser un dev
perfil de una forma más versátil de especificar dependencias.
fuente
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
etc ... de la misma manera que la gente hace módulos de bower que están destinados a extender angularjs .package.json
que se ha resuelto en otros gestores de paquetes.Respuestas:
El módulo de codependencia puede ser lo que está buscando, o cualquier cosa que haga algo similar a:
package.json
que no son instaladas automáticamente pornpm install
, digamosoptionalPeerDependencies
require
función de estilo personalizado que conoceoptionalPeerDependencies
y hace lo correcto, incluyendo lanzar / advertencia cuando no se encuentra nada que cumpla con una clase de módulos requeridos (por ejemplo, ningunoredis
, nimongo
, nimysql
, ni , etc. están instalados).Una variación sería si la funcionalidad principal del módulo funciona sin dependencias opcionales (por ejemplo, patrón de complemento), sin error / advertencia cuando no se encuentra nada que cumpla con una dependencia de igual.
Otra variación es hacer la lista anterior mientras se tienen en cuenta las dependencias de producción versus desarrollo, es decir, un análogo para
dependencies
ydevDependencies
.Quizás combinado con un requerimiento bajo demanda de tal manera que los módulos opcionales se requieran perezosamente, por ejemplo:
fuente
codependency
que proporciona el módulo en caso de que el módulo se evapore de NPM y porque los enlaces sin extractos tienen una forma SO incorrecta.Si desea dependencias opcionales simples como complementos, por ejemplo, si instala foo, lo ejecutará colorido, pero si no está instalado, no tiene ningún problema y lo verá en gris, entonces podría usar dependencias opcionales en el paquete .json :
Y en el código:
Extraído de la documentación de package.json .
fuente
Lo que hago es configurar un script de instalación en mi package.json, dentro
scripts
, de esta manera:Se ejecutará justo después de los
npm install
acabados. Lo uso principalmente para generar automáticamente un.env
archivo con valores predeterminados.El
my-install.js
script podría ejecutar diferentes comandos, crear archivos, solicitar la entrada del usuario, por lo que podría decir "¿Quieres Redis o Mongo?":Esta es una respuesta muy rápida, echa un vistazo a readline para leer la entrada del usuario correctamente y el proceso hijo para ejecutar comandos y procesamiento de salida, etc.
También tenga en cuenta que el script de instalación podría ser lo que desee (python, bash, etc.)
fuente
npm install
nuevamente dentro de un script de instalación también puede desencadenar un comportamiento no deseado. No recomiendo esta solución.npm realmente no fue diseñado para esto, ya que una de las partes más difíciles de la administración de dependencias es garantizar compilaciones rápidas y reproducibles que sean fáciles y relativamente a prueba de fallas. Pero creo que hay un caso de uso, y ciertamente lo hubo para mí. Entonces escribí un paquete para hacer exactamente lo que está pidiendo.
Mi paquete es
install-subset
y puede instalarse globalmente connpm install -g install-subset
https://www.npmjs.com/package/install-subset
Primero, crea listas blancas y negras para subconjuntos de instalación con nombre en su package.json de esta manera:
Luego llámalo con, por ejemplo,
install-subset test
Esto reescribirá temporalmente su package.json para no instalar esos paquetes en la lista negra, luego lo restaurará, lo que dependiendo de los paquetes puede ahorrar mucho tiempo y ancho de banda.
También funciona con hilo, es de código abierto y los problemas / relaciones públicas son bienvenidos.
En muchos casos, utilizo esto en nuestro servidor ci para reducir el tiempo de compilación, y en nuestro último proyecto React Native, tomamos nuestra típica instalación nueva de desarrollador de 72 segundos a aproximadamente 20 segundos.
fuente