scripts que librerias last example node.js npm node-gyp

node.js - librerias - package.json que es



npm package.json Dependencia especĂ­fica del sistema operativo (4)

¿Hay alguna forma de especificar dependencias específicas del sistema operativo en un archivo npm package.json?

Por ejemplo, solo querría instalar ''dbus'' ( https://npmjs.org/package/dbus ) como una dependencia para mi módulo si el usuario está ejecutando Linux. Tendría una dependencia diferente para Mac y Windows.


Citando @npm_support en:

https://twitter.com/npm_support/status/968195526989512705

2/2 Si desea evitar los problemas de instalación relacionados con las dependencias, una ruta es escribir un contenedor que se requiere como una dependencia regular, y asegurarse de que tiene optionalDeps (y también asegurarse de que el contenedor verifica que tiene todo necesitaba trabajar).

Pero en mi humilde opinión, parece más una solución que resolver el problema de verdad.

Puedo entender que npm quiere preservar la portabilidad y evitar lidiar con las especificaciones de la plataforma, pero tiene que hacerse de todos modos y en mi humilde opinión hacerlo en tiempo de ejecución no es óptimo (especialidad si se quiere optimizar el tamaño del código).

Así que hoy no tengo una solución óptima para compartir, sino una discusión abierta para la propuesta.

¿No se pueden admitir "dependencias condicionales" en npm?

Lo primero que me vino a la mente fue agregar una sección "anular" que cambiará (+ agregar, quitar, reemplazar) las secciones analizadas actuales.

Por ejemplo:

dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }

Y otra opción sugerida por un desarrollador que conozco sería la de introducir una palabra clave provee , luego varios módulos podrían proporcionar la misma semántica que la que resolvería el solucionador (a la debian), pero está generando una sobrecarga similar.

Estoy buscando un enfoque genérico no solo centrado en el soporte del sistema operativo sino también en otros sabores del paquete (dependiendo de los motores, por ejemplo).

¿Conoces algún problema relacionado en el rastreador de NPM? si no, estoy considerando presentar un error para rastrearlo:

https://github.com/npm/npm/issues?q=dependencies+conditional

Comentarios bienvenidos sobre esta idea.


Creo que la respuesta corta es no. Sin embargo, puedo pensar en un par de soluciones: lo más simple es simplemente agregar todo a package.json independientemente del SO, y luego require() el correcto en el tiempo de ejecución.

Si eso no funciona para usted, es posible que pueda usar un script de instalación para obtener el resultado que busca: https://docs.npmjs.com/misc/scripts

No lo he probado, pero creo que funcionaría:

Agregue algo como esto a su paquete. Json:

,"scripts": { "install": "node install_dependencies.js" }

Y luego agregue un archivo install_dependencies.js que verifique el sistema operativo y ejecute los npm install ... apropiados de npm install ...


Existe una buena forma de hacerlo, dependiendo de su configuración.

npm package.json admite una clave os ,

y también optionalDependencies

  • os se puede usar para especificar en qué SO se puede instalar un módulo.
  • Las dependencias optionalDependencies son dependencias de módulos que, si no se pueden instalar, npm las omite y continúa la instalación.

De esta manera, puede hacer que su módulo tenga una dependencia opcional para cada SO, y solo el que funciona se cargará / instalará ^. ^

EDITAR: Como @Sebastien menciona a continuación, este enfoque es peligroso . Para cualquier sistema operativo dado, al menos una de sus dependencias es "obligatoria" y el resto "opcional". Hacer que todas las versiones de la dependencia sean opcionales significa que si la instalación falla por un motivo legítimo, omitirá la instalación en silencio y se perderá una dependencia que realmente necesita.


También está el módulo bindings-shyp :

https://www.npmjs.com/package/bindings-shyp

Módulo auxiliar para cargar el archivo .node de su módulo nativo

Este es un módulo de ayuda para los autores de los módulos de complemento nativos de Node.js. Básicamente es la "navaja suiza" que requiere (.) El archivo .node de su módulo nativo.

A lo largo del curso de la historia de complementos nativos de Node, los complementos han sido compilados en una variedad de lugares diferentes, dependiendo de qué herramienta de compilación y qué versión de nodo se utilizó. Para empeorar las cosas, ahora la herramienta de compilación gyp puede producir una compilación Release o Debug, cada una de las cuales se integra en diferentes ubicaciones.

Este módulo verifica todas las ubicaciones posibles en las que se crearía un complemento nativo y devuelve el primero que se carga correctamente.