Odpowiedni hashbang dla skryptów Node.js.

96

Próbuję stworzyć skrypt dla node.js, który będzie działał w wielu środowiskach. Szczególnie dla mnie przełączam się między OS X i Ubuntu. W pierwszym przypadku Node jest instalowany jako node, ale w drugim jest nodejs. W górnej części mojego skryptu mogę mieć:

#!/usr/bin/env node

lub

#!/usr/bin/env nodejs

Wolałbym, aby skrypt działał jako plik wykonywalny dla dowolnego środowiska, o ile jest zainstalowany węzeł, zamiast mieć jedno lub drugie określenie polecenia ( ./script-name.jsvs. node script-name.js).

Czy istnieje sposób określenia hashbang kopii zapasowej lub takiego, który jest zgodny w obu przypadkach dla node.js?

Pigułki wybuchowe
źródło
możesz stworzyć skrypt powłoki, który będzie wywoływał twój skrypt, który będzie próbował dowiedzieć się, gdzie mieszka węzeł i jak się nazywa.
Doon
4
Wiele sugestii w tej odpowiedzi na stronie Unix - unix.stackexchange.com/questions/65235/...
sargant
Mam skrypt nodejs, który zmieniłem z #!/usr/bin/nodena, #!/usr/bin/nodejskiedy uaktualniłem Ubuntu 12.04 do 12.10. I jest wywoływany z opakowania, które sprawdza oba. Aby omówić #!/usr/bin/envwłamanie, zobacz to pytanie i moją odpowiedź .
Keith Thompson
1
Jest TC39 propozycja w Etapie 3 o nazwie „Hashbang Grammar”, który ma na celu standarize używane hashbangs: github.com/tc39/proposal-hashbang
M. Twaróg

Odpowiedzi:

156

Jeśli twój skrypt jest przeznaczony do użytku przez programistów Node, powinieneś po prostu użyć

#!/usr/bin/env node

i nie przejmuj się próbami zgodności z ludźmi, którzy mają zainstalowany tylko Node jako nodejs.

Racjonalne uzasadnienie:

  • To właśnie robią fajne dzieciaki, a jeśli ty też tego nie robisz, nie jesteś fajny. Główne projekty węzłów, takie jak jshint , karma , bower , a nawet npm, po prostu używają #!/usr/bin/env nodejako shebang dla swoich wykonywalnych skryptów.
  • Ponieważ robią to fajne dzieciaki, każdy, kto pracuje z Node w systemie Ubuntu, skonfigurował /usr/bin/nodejako łącze symboliczne do nodejs. Są wysoko obiekty instrukcje robić to tutaj na przepełnienie stosu i całej sieci. Był nawet nodejs-legacypakiet, którego celem było stworzenie dla Ciebie tego dowiązania symbolicznego. Ludzie, którzy używają Node, wiedzą, jak rozwiązać ten problem w Ubuntu i muszą to zrobić, jeśli chcą używać prawie każdego oprogramowania kiedykolwiek napisanego w Node.
  • Wydaje się, że problem już nie istnieje w systemie Ubuntu 14.04; Właśnie wyczyściłem Node, uruchomiłem apt-get install nodejsi utworzyłem /usr/bin/nodejako dowiązanie symboliczne do /etc/alternatives/node. Podejrzewam, że ludzie dotknięci tą kwestią stanowią malejącą mniejszość.

Nawet jeśli celujesz w analfabetów Node, możesz nadal chcieć używać #!/usr/bin/env node, być może dodając ewentualną potrzebę ręcznego tworzenia dowiązań symbolicznych lub instalacji nodejs-legacypakietu do dokumentacji instalacji, jeśli uznasz to za konieczne. Zwróć uwagę, że jeśli ktoś, kto nodejsjest nodeniedostępny, ale nie jest dostępny, spróbuje uruchomić program za pomocą powyższego shebang, zobaczy:

/ usr / bin / env: node: Nie ma takiego pliku lub katalogu

i googlowanie, które da im poprawkę w pierwszym wyniku i wiele razy na pierwszej stronie.

Jeśli naprawdę, desperacko chcesz się upewnić, że użytkownik może uruchomić twoje oprogramowanie w systemie, w którym nodejsjest ono dostępne, ale nodenie jest (lub gdzie nodejest w rzeczywistości program Amateur Packet Radio Node ), możesz użyć tego "dwuwierszowego shebang" wziętego z Unix i Linux Stack Exchange :

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

console.log('Hello world!');

ale czy naprawdę musisz to robić, gdy prawie nikt inny w świecie węzłów nie jest?

Mark Amery
źródło
2
Jeśli nodejspreferowana jest obsługa pliku wykonywalnego, nieco ładniejsze może być użycie shebang z #!/bin/shi //bin/false || exec "$(command -v nodejs || command -v node)" "$0".
lennartcl
2
Zauważ, że nie możesz przekazywać argumentów do węzła w systemie Linux , na przykład --experimental-modules, jeśli używasz tej envlinii shebang. Wokół są hacki, ale są brzydkie .
Dan Dascalescu