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.js
vs. 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?
#!/usr/bin/node
na,#!/usr/bin/nodejs
kiedy uaktualniłem Ubuntu 12.04 do 12.10. I jest wywoływany z opakowania, które sprawdza oba. Aby omówić#!/usr/bin/env
włamanie, zobacz to pytanie i moją odpowiedź .Odpowiedzi:
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:
#!/usr/bin/env node
jako shebang dla swoich wykonywalnych skryptów./usr/bin/node
jako łącze symboliczne donodejs
. Są wysoko obiekty instrukcje robić to tutaj na przepełnienie stosu i całej sieci. Był nawetnodejs-legacy
pakiet, 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.apt-get install nodejs
i utworzyłem/usr/bin/node
jako 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 instalacjinodejs-legacy
pakietu do dokumentacji instalacji, jeśli uznasz to za konieczne. Zwróć uwagę, że jeśli ktoś, ktonodejs
jestnode
niedostępny, ale nie jest dostępny, spróbuje uruchomić program za pomocą powyższego shebang, zobaczy: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
nodejs
jest ono dostępne, alenode
nie jest (lub gdzienode
jest 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?
źródło
nodejs
preferowana jest obsługa pliku wykonywalnego, nieco ładniejsze może być użycie shebang z#!/bin/sh
i//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
.--experimental-modules
, jeśli używasz tejenv
linii shebang. Wokół są hacki, ale są brzydkie .