npm package.json Dépendance spécifique du système d’exploitation

Existe-t-il un moyen de spécifier des dépendances spécifiques au système d’exploitation dans un fichier npm package.json?

Par exemple, je voudrais seulement installer ‘dbus’ ( https://npmjs.org/package/dbus ) en tant que dépendance de mon module si l’utilisateur utilise Linux. J’aurais une dépendance différente pour Mac et Windows.

Il existe une bonne façon de procéder, en fonction de votre configuration.

npm package.json supporte une clé os ,

et aussi facultatifDépendances

  • os peut être utilisé pour spécifier le système d’exploitation sur lequel un module peut être installé.
  • optionalDependencies sont des dépendances de module que si elles ne peuvent pas être installées, npm les ignore et continue l’installation.

De cette façon, vous pouvez faire en sorte que votre module ait une dépendance facultative pour chaque système d’exploitation, et seulement celle qui fonctionne sera chargée / installée ^.

EDIT: Comme @Sebastien le mentionne ci-dessous, cette approche est dangereuse . Pour n’importe quel système d’exploitation, au moins une de vos dépendances est “requirejse” et le rest “facultatif”. Rendre toutes les versions de la dépendance facultatives signifie que si votre installation échoue pour une raison légitime, elle ignorera silencieusement l’installation et vous manquerez une dépendance dont vous avez vraiment besoin.

Je pense que la réponse courte est non. Je peux penser à quelques solutions de contournement cependant – le plus simple est d’append tout à package.json quel que soit le système d’exploitation, puis d’ require() le bon à l’exécution.

Si cela ne fonctionne pas pour vous, vous pouvez utiliser un script d’installation pour obtenir le résultat recherché – https://docs.npmjs.com/misc/scripts

Je n’ai pas testé cela mais je pense que cela fonctionnerait:

Ajoutez quelque chose comme ceci à votre package.json:

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

Et puis ajoutez un fichier install_dependencies.js qui vérifie le système d’exploitation et exécute les commandes npm install ... appropriées.

Il y a aussi le module bindings-shyp :

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

Module d’aide au chargement du fichier .node de votre module natif

Ceci est un module d’aide pour les auteurs de modules d’additifs natifs Node.js. C’est fondamentalement le “couteau suisse” de require () dans le fichier .node de votre module natif.

Tout au long de l’historique des addons natifs de Node, les addons ont été compilés à différents endroits, en fonction de l’outil de construction et de la version de nœud utilisée. Pour aggraver les choses, maintenant l’outil de construction gyp peut produire une version Release ou Debug, chacune étant construite dans des emplacements différents.

Ce module vérifie tous les emplacements possibles d’un addon natif, et renvoie le premier chargé avec succès.

Citant @npm_support à:

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

2/2 Si vous souhaitez éviter les problèmes d’installation liés aux dépendances, une méthode consiste à écrire un wrapper requirejs en tant que dépendance régulière, et à vous assurer qu’il possède des optionalDeps (et que le gestionnaire vérifie également que vous disposez de tout le nécessaire pour travailler).

Mais à mon humble avis, cela ressemble plus à une solution de contournement que la résolution du problème pour de vrai.

Je peux comprendre que npm souhaite préserver la portabilité et éviter de gérer les spécificités de la plate-forme, mais cela doit être fait de toute façon et IMHO à l’exécution n’est pas optimal (spécialité si vous voulez optimiser la taille du code).

Donc, aujourd’hui, je n’ai pas de solution optimale à partager, mais une discussion ouverte pour la proposition.

Les “dépendances conditionnelles” ne peuvent-elles pas être supscopes dans npm?

La première chose qui me vint à l’esprit était d’append une section “override” qui changerait (+ add, -remove, = replace) les sections analysées actuelles.

Par exemple:

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

Et une autre option suggérée par un développeur que je connais serait d’introduire un mot clé fournit , puis plusieurs modules pourraient fournir une même sémantique que celle qui serait satisfaite par le résolveur (à la debian), mais cela génère une surcharge similaire.

Je recherche une approche générique non seulement axée sur la prise en charge du système d’exploitation, mais également sur d’autres variantes de package (en fonction des moteurs, par exemple).

Connaissez-vous un problème lié au traqueur NPM? Si ce n’est pas le cas, j’envisage de déposer un bug pour être suivi à:

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

Rétroaction bienvenue sur cette idée.