W nodejs używam __dirname . Co to jest równoważne w Golang?
Poszukałem go i znalazłem ten artykuł http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Gdzie używa poniżej kodu
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Ale czy jest to właściwy sposób, czy idiomatyczny sposób w Golang?
0
, nie1
, doruntime.Caller()
.runtime.Caller(0)
poda ścieżkę do pliku źródłowego, np$GOPATH/src/packagename/main.go
. Inne odpowiedzi w tym wątku próbują zwrócić ścieżkę pliku wykonywalnego (jak$GOPATH/bin/packagename
).Odpowiedzi:
To powinno to zrobić:
źródło
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(uwagaruntime.Caller(0)
, zamiastruntime.Caller(1)
)EDYCJA: Od wersji 1.8 (wydanej w lutym 2017 r.) Zalecanym sposobem jest
os.Executable
:Aby uzyskać tylko katalog pliku wykonywalnego, możesz użyć
path/filepath.Dir
.Przykład :
STARA ODPOWIEDŹ:
Powinieneś być w stanie używać
os.Getwd
Na przykład:
źródło
runtime.Caller
jest to najbliższe „idiomatic”path/filepath.Dir
ponieważpath.Dir
działa tylko z ukośnikami (styl uniksowy) jako separatorami katalogów.Użyj pakietu osext
Zapewnia funkcję,
ExecutableFolder()
która zwraca bezwzględną ścieżkę do folderu, w którym znajduje się aktualnie wykonywalny program (przydatny do zadań cron). Jest wieloplatformowy.Dokumentacja online
źródło
go run main.go
do rozwoju lokalnego. Nie wiem, jak najlepiej to obejść bez wcześniejszego budowania pliku wykonywalnego.go run
. Te pliki binarne są za każdym razem umieszczane w folderze tymczasowym.go install
, a następnie uruchomićgo build -v *.go && ./main
.-v
Powie ci, które pliki są budowane. Ogólnie stwierdziłem, że czas różni się odgo run
igo build
jest do zaakceptowania, jeśli już biegnęgo install
. Dla użytkowników systemu Windows w programie PowerShell polecenie togo build -v {*}.go && ./main.exe
$GOPATH/bin/
, dlaczego nie skorzystać$GOPATH/bin/
?Jak stwierdzono w komentarzu, zwraca katalog, który jest obecnie aktywny.
źródło
jeśli skorzystasz w ten sposób:
dostaniesz ścieżkę / tmp, gdy uruchomisz program przy użyciu jakiegoś IDE, takiego jak GoLang, ponieważ plik wykonywalny zapisze i uruchomi się z / tmp
myślę, że najlepszym sposobem na uzyskanie aktualnego katalogu roboczego lub „.” jest :
funkcja os.Getwd () zwróci bieżący katalog roboczy. i to wszystko bez korzystania z zewnętrznej biblioteki: D
źródło
Jeśli używasz pakietu osext od kardianos i musisz testować lokalnie, jak skomentował Derek Dowling:
Rozwiązaniem tego jest utworzenie narzędzia gorun.exe zamiast używania go run. Narzędzie gorun.exe skompiluje projekt przy użyciu „go build”, a następnie uruchomi go zaraz po tym, w normalnym katalogu projektu.
Miałem ten problem z innymi kompilatorami i odkryłem, że robię te narzędzia, ponieważ nie są one dostarczane z kompilatorem ... jest to szczególnie tajemnicze z narzędziami takimi jak C, gdzie musisz skompilować i połączyć, a następnie uruchomić (zbyt dużo pracy).
Jeśli komuś spodoba się mój pomysł na gorun.exe (lub elfa), prawdopodobnie wkrótce załaduję go do github ..
Przepraszamy, ta odpowiedź ma charakter komentarza, ale nie mogę komentować, ponieważ nie mam jeszcze wystarczająco dużej reputacji.
Alternatywnie, „go run” można zmodyfikować (jeśli nie ma już tej funkcji), aby mieć parametr taki jak „go run -notemp”, aby nie uruchamiać programu w katalogu tymczasowym (lub coś podobnego). Ale wolałbym po prostu wpisywać gorun lub „gor”, ponieważ jest on krótszy niż zwinięty parametr. Gorun.exe lub gor.exe musiałby zostać zainstalowany w tym samym katalogu, co kompilator go
Wdrożenie gorun.exe (lub gor.exe) byłoby trywialne, ponieważ zrobiłem to z innymi kompilatorami w zaledwie kilku wierszach kodu ... (słynne ostatnie słowa ;-)
źródło
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
zamiast tegoos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksPełna wersja demo:
źródło
Czasami to wystarczy, pierwszym argumentem zawsze będzie ścieżka do pliku
źródło
Odpowiedź Gustavo Niemeyera jest świetna. Ale w systemie Windows proces uruchomieniowy jest przeważnie w innym katalogu, takim jak ten:
Jeśli użyjesz względnej ścieżki pliku, na przykład
"/config/api.yaml"
, użyje ścieżki projektu, w której istnieje kod.źródło