web-dev-qa-db-fra.com

Hashbang approprié pour les scripts Node.js

J'essaie de créer un script pour node.js qui fonctionnera dans plusieurs environnements. En particulier pour moi, je bascule entre OS X et Ubuntu. Dans le premier, Node est installé en tant que node, mais dans le second, c'est nodejs. En haut de mon script, je peux avoir:

#!/usr/bin/env node

ou

#!/usr/bin/env nodejs

Je préfère que le script soit exécuté en tant qu'exécutable pour l'un ou l'autre environnement tant que le nœud est installé plutôt que l'un ou l'autre doit spécifier la commande (./script-name.js contre. node script-name.js).

Existe-t-il un moyen de spécifier un hashbang de sauvegarde ou un qui est compatible dans les deux cas pour node.js?

63
Explosion Pills

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

#!/usr/bin/env node

et ne vous embêtez pas à essayer de compatibilité avec des gens qui ont seulement Node installé en tant que nodejs.

Raisonnement:

  • C'est ce que font les enfants sympas, et si vous ne le faites pas aussi, vous n'êtes pas cool. Projets majeurs de nœuds comme jshint , karma , bower , et même npm utilisez simplement #!/usr/bin/env node comme Shebang pour leurs scripts exécutables.
  • Parce que les enfants cool le font, toute personne qui travaille avec Node sur Ubuntu a mis en place un /usr/bin/node en tant que lien symbolique vers nodejs. Il y a instructions très consultées sur cette opération ici sur Stack Overflow, et partout sur le Web. Il y avait même le nodejs-legacy package dont le but était de créer ce lien symbolique pour vous. Les gens qui utilisent Node savent comment résoudre ce problème sur Ubuntu, et ils doivent s'ils veulent utiliser pretty la plupart des logiciels jamais écrits dans Node.
  • Le problème ne semble même plus exister sur Ubuntu 14.04; Je viens de purger Node et j'ai exécuté un apt-get install nodejs et il a créé /usr/bin/node en tant que lien symbolique vers /etc/alternatives/node. Les personnes touchées par ce problème sont, je suppose, une minorité qui diminue.

Même si vous ciblez des personnes analphabètes Node, vous pouvez toujours utiliser #!/usr/bin/env node, ajoutant peut-être le besoin éventuel de créer ou d'installer manuellement un lien symbolique nodejs-legacy package à votre documentation d'installation si vous le jugez nécessaire. Notez que si quelqu'un avec nodejs mais pas node disponible essaie d'exécuter votre programme avec le Shebang ci-dessus, il verra:

/ usr/bin/env: node: aucun fichier ou répertoire de ce type

et Googler ça leur donnera le correctif dans le premier résultat et plusieurs fois sur la première page.

Si vous voulez vraiment et désespérément vous assurer que l'utilisateur peut exécuter votre logiciel sur un système où nodejs est disponible mais node ne l'est pas (ou où node est en fait le - Amateur Packet Radio Node program ), alors vous pouvez utiliser ce "Shebang à deux lignes" tiré de nix & 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?

97
Mark Amery