Hashbang approprié pour les scripts Node.js

J’essaie de créer un script pour node.js qui fonctionnera dans plusieurs environnements. Surtout pour moi, je passe de OS X à Ubuntu. Dans le premier, Node est installé en tant que node , mais dans le dernier cas, il s’agit de nodejs . En haut de mon script, je peux avoir:

 #!/usr/bin/env node 

ou

 #!/usr/bin/env nodejs 

Je préférerais que le script soit exécuté en tant qu’exécutable pour l’un ou l’autre environnement tant que le noeud est installé plutôt que si l’un ou l’autre doit spécifier la commande ( ./script-name.js vs. node script-name.js ).

Est-il possible de spécifier un hashbang de sauvegarde ou un hashbang compatible dans les deux cas pour node.js?

Si votre script est destiné à être utilisé par les développeurs Node, vous devez absolument utiliser

 #!/usr/bin/env node 

et pas la peine d’essayer de compatibilité avec des personnes qui ont seulement Node installé en tant que nodejs .

Raisonnement:

  • C’est ce que font les enfants cool, et si vous ne le faites pas aussi, vous n’êtes pas cool. Les principaux projets de nœuds tels que jshint , karma , bower et même npm utilisent simplement le #!/usr/bin/env node comme shebang pour leurs scripts exécutables.
  • Parce que les enfants cool le font, tous ceux qui travaillent avec Node sur Ubuntu ont configuré un /usr/bin/node comme lien symbolique vers nodejs . Il y a des instructions très visibles sur le faire ici sur Stack Overflow, et sur tout le Web. Il y avait même le package nodejs-legacy dont le but était de créer ce lien symbolique pour vous. Les personnes qui utilisent Node savent comment résoudre ce problème sur Ubuntu, et elles doivent le faire si elles veulent utiliser à peu près tous les logiciels écrits en Node.
  • Le problème ne semble même plus exister sur Ubuntu 14.04; Je viens de purger Node et j’ai lancé un apt-get install nodejs qui a créé /usr/bin/node tant que lien symbolique vers /etc/alternatives/node . Je soupçonne que les personnes touchées par ce problème sont en minorité.

Même si vous ciblez des personnes illettrées, vous pouvez toujours utiliser le #!/usr/bin/env node , en ajoutant peut-être le besoin éventuel de création manuelle de lien symbolique ou d’installation du paquet nodejs-legacy dans votre documentation d’installation. juge nécessaire. Notez que si quelqu’un avec nodejs mais pas de node disponible essaie d’exécuter votre programme avec le shebang ci-dessus, il verra:

/ usr / bin / env: node: Pas de tel fichier ou répertoire

et Google qui leur donnera le correctif dans le premier résultat et plusieurs fois sur la première page.

Si vous voulez vraiment vous assurer que l’utilisateur peut exécuter votre logiciel sur un système sur lequel nodejs est disponible mais que node n’est pas (ou où le node est en fait le programme Amateur Packet Radio Node ), alors vous pouvez utiliser cette shebang “extrait de Unix & Linux Stack Exchange :

 #!/bin/sh ':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log('Hello world!'); 

mais avez-vous vraiment besoin de faire cela quand presque personne d’autre dans le monde Node n’est?