Estou tentando criar um script para node.js que funcionará em vários ambientes. Particularmente para mim, estou alternando entre o OS X e o Ubuntu. No primeiro, o Node é instalado como node
, mas no segundo ele é nodejs
. No início do meu script, posso ter:
#!/usr/bin/env node
ou
#!/usr/bin/env nodejs
Prefiro que o script seja executado como um executável para qualquer ambiente, desde que o nó esteja instalado, em vez de ter um ou outro especificando o comando ( ./script-name.js
vs. node script-name.js
).
Existe alguma maneira de especificar um hashbang de backup ou que seja compatível em ambos os casos para node.js?
#!/usr/bin/node
para#!/usr/bin/nodejs
quando atualizei do Ubuntu 12.04 para 12.10. E é invocado a partir de um wrapper que verifica os dois. Para uma discussão sobre o#!/usr/bin/env
hack, veja esta pergunta e minha resposta .Respostas:
Se o seu script se destina ao uso por desenvolvedores do Node, você deve simplesmente usar
#!/usr/bin/env node
e não se preocupe em tentar a compatibilidade com pessoas que têm apenas o Node instalado como
nodejs
.Justificativa:
#!/usr/bin/env node
como o shebang para seus scripts executáveis./usr/bin/node
como um link simbólico paranodejs
. Existem instruções muito vistas sobre como fazer isso aqui no Stack Overflow e em toda a web. Existia até onodejs-legacy
pacote cujo propósito era criar este link simbólico para você. As pessoas que usam o Node sabem como consertar esse problema no Ubuntu e precisam fazê-lo se quiserem usar praticamente qualquer software já escrito em Node.apt-get install nodejs
e ele foi criado/usr/bin/node
como um link simbólico para/etc/alternatives/node
. As pessoas afetadas por esse problema são, eu suspeito, uma minoria cada vez menor.Mesmo que você tenha como alvo pessoas analfabetas do Node, você ainda pode querer usar
#!/usr/bin/env node
, talvez adicionando a possível necessidade de criação de link simbólico manual ou instalação donodejs-legacy
pacote à sua documentação de instalação se você julgar necessário. Observe que se alguém com,nodejs
mas nãonode
disponível, tentar executar seu programa com o esquema acima, verá:e Googling que lhes dará a correção no primeiro resultado e muitas vezes na primeira página.
Se você realmente deseja desesperadamente ter certeza de que o usuário pode executar seu software em um sistema onde
nodejs
está disponível, masnode
não está (ou ondenode
está realmente o programa Amateur Packet Radio Node ), então você pode usar este "shebang de duas linhas" do Unix e Linux Stack Exchange :#!/bin/sh ':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log('Hello world!');
mas você realmente precisa fazer isso quando quase ninguém mais no mundo Node precisa?
fonte
nodejs
executável for preferido, você pode achar um pouco mais bonito usar um shebang com#!/bin/sh
e//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
.--experimental-modules
, se você usar estaenv
linha shebang. Existem hacks por aí, mas eles são feios .