In nodejs verwende ich __dirname . Was ist das Äquivalent dazu in Golang?
Ich habe gegoogelt und diesen Artikel herausgefunden http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Wo er unten Code verwendet
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Aber ist es der richtige oder idiomatische Weg in Golang?
0
nicht1
an übergebenruntime.Caller()
.runtime.Caller(0)
gibt Ihnen den Pfad der Quelldatei, wie$GOPATH/src/packagename/main.go
. Die anderen Antworten in diesem Thread versuchen, den Pfad der ausführbaren Datei (wie$GOPATH/bin/packagename
) zurückzugeben.Antworten:
Dies sollte es tun:
quelle
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(beachten Sieruntime.Caller(0)
stattdessenruntime.Caller(1)
)BEARBEITEN: Ab Go 1.8 (veröffentlicht im Februar 2017) wird Folgendes empfohlen
os.Executable
:Um nur das Verzeichnis der ausführbaren Datei zu erhalten, können Sie verwenden
path/filepath.Dir
.Beispiel :
ALTE ANTWORT:
Sie sollten in der Lage sein zu verwenden
os.Getwd
Beispielsweise:
quelle
runtime.Caller
ist dies meiner Meinung nach der "idiomatische"path/filepath.Dir
weilpath.Dir
nur mit Schrägstrichen (Unix-Stil) als Verzeichnistrennzeichen funktioniert.Verwenden Sie das Paket osext
Es bietet eine Funktion
ExecutableFolder()
, die einen absoluten Pfad zu dem Ordner zurückgibt, in dem sich die aktuell ausgeführte ausführbare Programmdatei befindet (nützlich für Cron-Jobs). Es ist plattformübergreifend.Online-Dokumentation
quelle
go run main.go
für die lokale Entwicklung verwenden möchten. Ich bin mir nicht sicher, wie ich das am besten umgehen kann, ohne vorher jedes Mal eine ausführbare Datei zu erstellen.go run
. Diese Binärdateien werden jedes Mal in einem temporären Ordner abgelegt.go install
, dann laufengo build -v *.go && ./main
. Das-v
würde Ihnen sagen, welche Dateien erstellt werden. Im Allgemeinen habe ich festgestellt, dass die Zeit zwischengo run
undgo build
erträglich ist, wenn ich bereits gelaufen bingo install
. Für Windows-Benutzer auf Powershell wird der Befehl seingo build -v {*}.go && ./main.exe
$GOPATH/bin/
Warum nicht verwenden, da dies zurückkehren wird$GOPATH/bin/
?Wie im Kommentar angegeben, gibt dies das aktuell aktive Verzeichnis zurück.
quelle
Wenn Sie diesen Weg verwenden:
Sie erhalten den Pfad / tmp, wenn Sie ein Programm mit einer IDE wie GoLang ausführen, da die ausführbare Datei / tmp speichert und ausführt
Ich denke, der beste Weg, um das aktuelle Arbeitsverzeichnis oder '.' ist:
Die Funktion os.Getwd () gibt das aktuelle Arbeitsverzeichnis zurück. und alles ohne Verwendung einer externen Bibliothek: D.
quelle
Wenn Sie das Paket osext von kardianos verwenden und lokal testen müssen, wie Derek Dowling kommentierte:
Die Lösung hierfür besteht darin, ein Dienstprogramm gorun.exe zu erstellen, anstatt go run zu verwenden. Das Dienstprogramm gorun.exe kompiliert das Projekt mit "go build" und führt es direkt danach im normalen Verzeichnis Ihres Projekts aus.
Ich hatte dieses Problem mit anderen Compilern und stellte fest, dass ich diese Dienstprogramme erstellt habe, da sie nicht mit dem Compiler geliefert werden. Dies ist besonders geheimnisvoll bei Tools wie C, bei denen Sie sie kompilieren, verknüpfen und dann ausführen müssen (zu viel Arbeit).
Wenn jemand meine Idee von gorun.exe (oder elf) mag, werde ich sie wahrscheinlich bald auf github hochladen.
Entschuldigung, diese Antwort ist als Kommentar gedacht, aber ich kann keinen Kommentar abgeben, da ich noch keinen Ruf habe, der groß genug ist.
Alternativ könnte "go run" so geändert werden (falls diese Funktion noch nicht vorhanden ist), dass ein Parameter wie "go run -notemp" vorhanden ist, um das Programm nicht in einem temporären Verzeichnis (oder ähnlichem) auszuführen. Aber ich würde es vorziehen, nur gorun oder "gor" einzugeben, da es kürzer als ein verschlungener Parameter ist. Gorun.exe oder gor.exe müssten im selben Verzeichnis wie Ihr go-Compiler installiert werden
Die Implementierung von gorun.exe (oder gor.exe) wäre trivial, da ich es mit anderen Compilern in nur wenigen Codezeilen gemacht habe ... (berühmte letzte Wörter ;-)
quelle
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
stattdessen einfachos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksVollständige Demo:
quelle
Manchmal reicht dies aus, das erste Argument ist immer der Dateipfad
quelle
Gustavo Niemeyers Antwort ist großartig. In Windows befindet sich der Laufzeitprozess jedoch meist in einem anderen Verzeichnis:
Wenn Sie beispielsweise einen relativen Dateipfad verwenden,
"/config/api.yaml"
wird Ihr Projektpfad verwendet, in dem Ihr Code vorhanden ist.quelle