Estoy tratando de crear un script para node.js que funcione en múltiples entornos. Particularmente para mí, estoy cambiando entre OS X y Ubuntu. En el primero, Node se instala como node
, pero en el segundo lo es nodejs
. En la parte superior de mi guión, puedo tener:
#!/usr/bin/env node
o
#!/usr/bin/env nodejs
Prefiero que el script se ejecute como un ejecutable para cualquier entorno siempre que el nodo esté instalado en lugar de que uno u otro tenga que especificar el comando ( ./script-name.js
vs. node script-name.js
).
¿Hay alguna forma de especificar un hashbang de respaldo o uno que sea compatible en cualquier caso para node.js?
#!/usr/bin/node
que#!/usr/bin/nodejs
cuando he actualizado desde Ubuntu 12.04 a 12.10. Y se invoca desde un contenedor que comprueba ambos. Para una discusión sobre el#!/usr/bin/env
truco, vea esta pregunta y mi respuesta .Respuestas:
Si su script está diseñado para que lo utilicen desarrolladores de Node, debe usar
#!/usr/bin/env node
y no se moleste en probar la compatibilidad con personas que solo tienen Node instalado como
nodejs
.Razón fundamental:
#!/usr/bin/env node
como el tinglado por sus secuencias de comandos ejecutables./usr/bin/node
un enlace simbólico anodejs
. Hay instrucciones muy consultadas sobre cómo hacer esto aquí en Stack Overflow y en toda la web. Incluso estaba elnodejs-legacy
paquete cuyo único propósito era crear este enlace simbólico para usted. Las personas que usan Node saben cómo solucionar este problema en Ubuntu, y deben hacerlo si quieren usar prácticamente cualquier software escrito en Node.apt-get install nodejs
y se creó/usr/bin/node
como un enlace simbólico a/etc/alternatives/node
. Sospecho que las personas afectadas por este problema son una minoría cada vez menor.Incluso si está apuntando a personas analfabetas de Node, es posible que aún desee usar
#!/usr/bin/env node
, quizás agregando la posible necesidad de creación manual de enlaces simbólicos o instalación delnodejs-legacy
paquete a su documentación de instalación si lo considera necesario. Tenga en cuenta que si alguien connodejs
pero nonode
disponible intenta ejecutar su programa con el shebang anterior, verá:y buscar en Google que les dará la solución en el primer resultado y muchas veces en la primera página.
Si realmente y desesperadamente desea asegurarse de que el usuario pueda ejecutar su software en un sistema donde
nodejs
está disponible peronode
no lo está (o dóndenode
está realmente el programa Nodo de radio de paquetes amateur ), entonces puede usar este "shebang de dos líneas" tomado de Unix y Linux Stack Exchange :#!/bin/sh ':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log('Hello world!');
pero, ¿realmente necesitas hacer esto cuando casi nadie más en el mundo Node lo hace?
fuente
nodejs
se prefiere la compatibilidad con el ejecutable, es posible que le resulte un poco más bonito usar un shebang con#!/bin/sh
y//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
.--experimental-modules
, si usa estaenv
línea shebang. Hay trucos por ahí, pero son feos .