Jak uzyskać ścieżkę do skryptu w Node.js?
Wiem, że istnieje process.cwd
, ale dotyczy to tylko katalogu, w którym skrypt został wywołany, a nie samego skryptu. Na przykład powiedz, że jestem /home/kyle/
i uruchamiam następujące polecenie:
node /home/kyle/some/dir/file.js
Jeśli zadzwonię process.cwd()
, mam /home/kyle/
, nie /home/kyle/some/dir/
. Czy istnieje sposób na uzyskanie tego katalogu?
Odpowiedzi:
Znalazłem to po ponownym przejrzeniu dokumentacji. Co szukałem były
__filename
i__dirname
zmienne moduł poziomie.__filename
to nazwa pliku bieżącego modułu. Jest to rozwiązana ścieżka bezwzględna bieżącego pliku modułu. (np/home/kyle/some/dir/file.js
)__dirname
to nazwa katalogu bieżącego modułu. (np/home/kyle/some/dir
)źródło
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Zasadniczo możesz to zrobić:
Skorzystaj z metody resolver () zamiast łączenia z „/” lub „\”, w przeciwnym razie wystąpią problemy z wieloma platformami.
Uwaga: __dirname to lokalna ścieżka modułu lub dołączonego skryptu. Jeśli piszesz wtyczkę, która musi znać ścieżkę głównego skryptu, jest to:
lub, aby po prostu uzyskać nazwę folderu:
źródło
var settings = require('./settings.json')
. Oczywiście jest to synchroniczne we / wy fs, więc nie rób tego w czasie wykonywania, ale podczas uruchamiania jest w porządku, a po załadowaniu zostanie buforowane.To polecenie zwraca bieżący katalog:
Na przykład, aby użyć ścieżki do odczytania pliku:
źródło
cd /foo; node bar/test.js
, bieżący katalog będzie/foo
, ale skrypt znajduje się w/foo/bar/test.js
.text.txt
byłby względny do bieżącego katalogu, który można po prostu odczytać i działałby, nie trzeba budować ścieżki bezwzględnejUżyj __dirname !!
Nazwa katalogu bieżącego modułu. To samo co path.dirname () z
__filename
.Przykład: uruchamianie węzła example.js z katalogu / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
W przypadku modułów ESM, których chcesz użyć:
import.meta.url
źródło
Jeśli chodzi o główny skrypt, jest tak prosty, jak:
Z dokumentacji Node.js :
Jeśli chcesz poznać ścieżkę pliku modułu, użyj __nazwa_pliku .
źródło
process.argv[1]
dotyczy tylko głównego skryptu, podczas gdy__filename
wskazuje plik wykonywanego modułu. Aktualizuję swoją odpowiedź, aby podkreślić różnicę. Mimo to nie widzę nic złego w użyciuprocess.argv[1]
. Zależy od własnych wymagań.Node.js 10 obsługuje moduły ECMAScript , gdzie
__dirname
i__filename
nie są już dostępne .Następnie, aby uzyskać ścieżkę do bieżącego modułu ES, należy użyć:
A dla katalogu zawierającego bieżący moduł:
źródło
--experimental-modules
flagą.źródło
__dirname
nie działa już z modułami ES .Każdy program Node.js ma w swoim środowisku jakieś zmienne globalne, które reprezentują pewne informacje o twoim procesie, a jedną z nich jest
__dirname
.źródło
__dirname
nie działa już z modułami ES .Wiem, że jest to dość stare, a pierwotne pytanie, na które odpowiadałem, jest oznaczone jako zduplikowane i skierowane tutaj, ale natknąłem się na problem próbujący zmusić reporterów jasmine do pracy i nie podobał mi się pomysł, że musiałem obniżyć wersję aby działało. Dowiedziałem się, że jasmine-reporters nie rozwiązuje poprawnie savePath i tak naprawdę umieszczam dane wyjściowe folderu raportów w katalogu jasmine-reporters zamiast w katalogu głównym, w którym uruchomiłem gulp. W celu dokonania tej pracy właściwie skończyło się używając process.env.INIT_CWD uzyskać wstępną bieżącego katalogu roboczego, który powinien być katalogiem, w którym prowadził łyk. Mam nadzieję, że to komuś pomoże.
źródło
Możesz użyć process.env.PWD, aby uzyskać bieżącą ścieżkę do folderu aplikacji.
źródło
Jeśli używasz
pkg
do pakowania aplikacji, przydatne będzie to wyrażenie:process.pkg
informuje, czy aplikacja została spakowana przezpkg
.process.execPath
przechowuje pełną ścieżkę do pliku wykonywalnego, który jest/usr/bin/node
podobny w przypadku bezpośrednich wywołań skryptów (node test.js
) lub spakowanej aplikacji.require.main.filename
zawiera pełną ścieżkę głównego skryptu, ale jest pusty, gdy Node działa w trybie interaktywnym.__dirname
zawiera pełną ścieżkę bieżącego skryptu, więc nie używam go (chociaż może być to, o co prosi OP; lepiej użyj,appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
zauważając, że w trybie interaktywnym__dirname
jest pusty.W trybie interaktywnym użyj albo,
process.argv[0]
aby uzyskać ścieżkę do pliku wykonywalnego węzła lubprocess.cwd()
aby uzyskać bieżący katalog.źródło
Skorzystaj z
basename
metodypath
modułu:Oto dokumentacja, z której wzięto powyższy przykład.
Jak zauważył Dan, Node pracuje nad modułami ECMAScript z flagą „--experimental-modules”. Węzeł 12 nadal obsługuje
__dirname
i__filename
jak wyżej.Jeśli używasz
--experimental-modules
flagi, istnieje alternatywne podejście .Alternatywą jest uzyskanie ścieżki do bieżącego modułu ES :
A dla katalogu zawierającego bieżący moduł:
źródło
Jeśli chcesz czegoś więcej jak 0 $ w skrypcie powłoki, spróbuj tego:
źródło
__dirname
i nie__filename
są już dostępne z modułami ES .