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_requirelos leiningenperfiles de Python y Clojure . ¿Algo así en npm? Realmente siento que devDependenciesdebería ser un devperfil de una forma más versátil de especificar dependencias.
fuente

MyPackage-CoreMyPackage-Db-MongoMyPackage-Db-Redisetc ... de la misma manera que la gente hace módulos de bower que están destinados a extender angularjs .package.jsonque 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.jsonque no son instaladas automáticamente pornpm install, digamosoptionalPeerDependenciesrequirefunción de estilo personalizado que conoceoptionalPeerDependenciesy 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
dependenciesydevDependencies.Quizás combinado con un requerimiento bajo demanda de tal manera que los módulos opcionales se requieran perezosamente, por ejemplo:
fuente
codependencyque 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 installacabados. Lo uso principalmente para generar automáticamente un.envarchivo con valores predeterminados.El
my-install.jsscript 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 installnuevamente 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-subsety puede instalarse globalmente connpm install -g install-subsethttps://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 testEsto 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