Wie würde ich den Pfad zum Skript in Node.js erhalten?
Ich weiß process.cwd
, dass es das gibt , aber das bezieht sich nur auf das Verzeichnis, in dem das Skript aufgerufen wurde, nicht auf das Skript selbst. Angenommen, ich bin dabei /home/kyle/
und führe den folgenden Befehl aus:
node /home/kyle/some/dir/file.js
Wenn ich anrufe process.cwd()
, bekomme ich /home/kyle/
nicht /home/kyle/some/dir/
. Gibt es eine Möglichkeit, dieses Verzeichnis zu erhalten?
Antworten:
Ich fand es, nachdem ich die Dokumentation noch einmal durchgesehen hatte. Was ich suchte, waren die Variablen auf
__filename
und__dirname
Modulebene.__filename
ist der Dateiname des aktuellen Moduls. Dies ist der aufgelöste absolute Pfad der aktuellen Moduldatei. (ex:/home/kyle/some/dir/file.js
)__dirname
ist der Verzeichnisname des aktuellen Moduls. (ex:/home/kyle/some/dir
)quelle
__dirname.split(path.sep).pop()
require('path').basename(__dirname);
Im Grunde können Sie dies tun:
Verwenden Sie resolve (), anstatt mit '/' oder '\' zu verketten. Andernfalls treten plattformübergreifende Probleme auf.
Hinweis: __dirname ist der lokale Pfad des Moduls oder des enthaltenen Skripts. Wenn Sie ein Plugin schreiben, das den Pfad des Hauptskripts kennen muss, ist dies:
oder, um nur den Ordnernamen zu erhalten:
quelle
var settings = require('./settings.json')
. Natürlich ist es synchron fs IO, also mach es nicht zur Laufzeit, aber zum Start ist es in Ordnung und sobald es geladen ist, wird es zwischengespeichert.Dieser Befehl gibt das aktuelle Verzeichnis zurück:
So verwenden Sie beispielsweise den Pfad zum Lesen der Datei:
quelle
cd /foo; node bar/test.js
, wäre das aktuelle Verzeichnis/foo
, aber das Skript befindet sich in/foo/bar/test.js
.text.txt
wäre, das Sie gerade lesen könnten, und es funktionieren würde, müssen Sie nicht den absoluten PfadVerwenden Sie __dirname !!
Der Verzeichnisname des aktuellen Moduls. Dies ist das gleiche wie der path.dirname () des
__filename
.Beispiel: Ausführen des Knotens example.js aus / Users / mjr
https://nodejs.org/api/modules.html#modules_dirname
Für ESModules möchten Sie Folgendes verwenden:
import.meta.url
quelle
Wenn es um das Hauptskript geht, ist es so einfach wie:
Aus der Node.js-Dokumentation :
Wenn Sie den Pfad einer Moduldatei kennen müssen, verwenden Sie __Dateiname .
quelle
process.argv[1]
nur für das Hauptskript gilt, während__filename
auf die ausgeführte Moduldatei verwiesen wird. Ich aktualisiere meine Antwort, um den Unterschied hervorzuheben. Trotzdem sehe ich nichts falsches daranprocess.argv[1]
. Kommt auf die Bedürfnisse an.Node.js 10 unterstützt ECMAScript - Module , wo
__dirname
und__filename
sind nicht mehr verfügbar .Um dann den Pfad zum aktuellen ES-Modul zu erhalten, muss Folgendes verwendet werden:
Und für das Verzeichnis mit dem aktuellen Modul:
quelle
--experimental-modules
Flag verfügbar .quelle
__dirname
funktioniert nicht mehr mit ES-Modulen .Jedes Node.js-Programm hat einige globale Variablen in seiner Umgebung, die einige Informationen über Ihren Prozess darstellen und eine davon sind
__dirname
.quelle
__dirname
sondern funktioniert auch nicht mehr mit ES-Modulen .Ich weiß, dass dies ziemlich alt ist, und die ursprüngliche Frage, auf die ich geantwortet habe, ist als doppelt markiert und hier gerichtet, aber ich bin auf ein Problem gestoßen, bei dem versucht wurde, Jasminreporter zum Arbeiten zu bringen, und die Idee, dass ich ein Downgrade durchführen musste, hat mir nicht gefallen damit es funktioniert. Ich fand heraus, dass Jasmin-Reporter den savePath nicht korrekt auflösten und die Ausgabe des Berichtsordners tatsächlich in das Verzeichnis Jasmin-Reporter anstatt in das Stammverzeichnis, in dem ich gulp ausgeführt habe, ablegten. Damit dies korrekt funktioniert, habe ich process.env.INIT_CWD verwendet , um das erste aktuelle Arbeitsverzeichnis abzurufen , das das Verzeichnis sein sollte, in dem Sie gulp ausgeführt haben. Hoffe das hilft jemandem.
quelle
Sie können process.env.PWD verwenden, um den aktuellen Pfad des App-Ordners abzurufen.
quelle
Wenn Sie
pkg
Ihre App zum Packen verwenden, finden Sie diesen Ausdruck nützlich:process.pkg
Gibt an, ob die App von gepackt wurdepkg
.process.execPath
Enthält den vollständigen Pfad der ausführbaren Datei, die/usr/bin/node
für den direkten Aufruf von scripts (node test.js
) oder der gepackten App gleich oder ähnlich ist .require.main.filename
Enthält den vollständigen Pfad des Hauptskripts, ist jedoch leer, wenn Node im interaktiven Modus ausgeführt wird.__dirname
Enthält den vollständigen Pfad des aktuellen Skripts, daher verwende ich es nicht (obwohl es möglicherweise das ist, was OP verlangt; dann sollten Sie besserappDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
beachten, dass der interaktive Modus__dirname
leer ist.Verwenden Sie im interaktiven Modus entweder
process.argv[0]
den Pfad zur ausführbaren Node-Datei oderprocess.cwd()
das aktuelle Verzeichnis.quelle
Verwenden Sie die
basename
Methode despath
Moduls:Hier ist die Dokumentation, aus der das obige Beispiel stammt.
Wie Dan betonte, arbeitet Node an ECMAScript-Modulen mit dem Flag "--experimental-modules". Knoten 12 unterstützt
__dirname
__filename
weiterhin und wie oben.Wenn Sie das
--experimental-modules
Flag verwenden, gibt es einen alternativen Ansatz .Die Alternative besteht darin, den Pfad zum aktuellen ES-Modul abzurufen :
Und für das Verzeichnis mit dem aktuellen Modul:
quelle
Wenn Sie mehr wie $ 0 in einem Shell-Skript möchten, versuchen Sie Folgendes:
quelle
__dirname
und__filename
sind mit ES-Modulen nicht mehr verfügbar .