Czy poniższy sposób jest najlepszym sposobem uzyskania katalogu domowego uruchomionego użytkownika? A może jest jakaś konkretna funkcja, którą przejrzałem?
os.Getenv("HOME")
Jeśli powyższe jest poprawne, to czy ktoś wie, czy takie podejście gwarantuje działanie na platformach innych niż Linux, np. Windows?
go
home-directory
Paul Ruane
źródło
źródło
$HOME
Nie jest koniecznie katalog domowy użytkownika. Na przykład mogę pisaćexport HOME=/something/else
przed uruchomieniem programu. Zwykle oznacza to, że chcę, aby program z/something/else
jakiegoś powodu traktował jako mój katalog domowy i zwykle program powinien to zaakceptować. Ale jeśli naprawdę potrzebujesz użytkownika rzeczywisty katalog domowy, zmienna środowiskowa nie musi ci go.Odpowiedzi:
W go 1.0.3 (prawdopodobnie również wcześniej) działa:
package main import ( "os/user" "fmt" "log" ) func main() { usr, err := user.Current() if err != nil { log.Fatal( err ) } fmt.Println( usr.HomeDir ) }
Jeśli ważne jest cross-kompilacji, należy rozważyć z
homedir
bibliotekiźródło
os.UserHomeDir ()
W go1.12 + możesz użyć os.UserHomeDir ()
Zobacz https://golang.org/pkg/os/#UserHomeDir
To powinno działać nawet bez włączonego CGO (tj.
FROM scratch
) I bez konieczności analizowania/etc/passwd
lub innych takich bzdur.źródło
Na przykład,
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } return os.Getenv("HOME") } func main() { dir := UserHomeDir() fmt.Println(dir) }
źródło
USERPROFILE
to katalog główny przestrzeni dyskowej użytkownika w systemie, ale NIE jest to miejsce, w którym aplikacje powinny zapisywać dane poza oknem dialogowym zapisywania. Jeśli masz konfigurację aplikacji, powinna być zapisana,APPDATA
a jeśli masz pamięć podręczną aplikacji (lub duże pliki, które nie powinny być synchronizowane przez sieć), powinna zostać zapisanaLOCALAPPDATA
w systemie Windows.Oto ładny, zwięzły sposób na zrobienie tego (jeśli używasz tylko systemu opartego na UNIX):
import ( "os" ) var home string = os.Getenv("HOME")
To tylko odpytuje zmienną środowiskową $ HOME.
--- Edytować ---
Teraz widzę, że ta sama metoda została zasugerowana powyżej. Zostawię ten przykład jako roztwór destylowany.
źródło
Podobna odpowiedź do @peterSO, ale szanuje
XDG_CONFIG_HOME
ścieżkę dla Linuksa.package main import ( "fmt" "os" "runtime" ) func userHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } else if runtime.GOOS == "linux" { home := os.Getenv("XDG_CONFIG_HOME") if home != "" { return home } } return os.Getenv("HOME") } func main() { fmt.Println(userHomeDir()) }
źródło
APPDATA
do konfiguracji iLOCALAPPDATA
dużych plików. Dla ogólnego przeznaczenia polecam,LOCALAPPDATA
aby twórcy aplikacji domyślnie nie niszczyli sieci korporacyjnych. 😊Powinieneś użyć zmiennej środowiskowej
USERPROFILE
lubHOMEPATH
w systemie Windows. Zobacz Rozpoznane zmienne środowiskowe (mile widziany byłby link do bardziej odpowiedniej dokumentacji).źródło
HOME
, ponieważ prawdopodobnie oznacza to, że biegasz pod cygwin.USERPROFILE
aniHOMEPATH
w systemie Windows. W prawie wszystkich przypadkach, w których deweloperzy ich używają, powinni używaćAPPDATA
lubLOCALAPPDATA
(w zależności od tego, czy rozsądna jest synchronizacja zawartości przez sieć podczas logowania / wylogowywania).go1.8rc2 ma funkcję go / build / defaultGOPATH, która pobiera katalog domowy. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
Poniższy kod jest wyodrębniany z funkcji defaultGOPATH.
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { env := "HOME" if runtime.GOOS == "windows" { env = "USERPROFILE" } else if runtime.GOOS == "plan9" { env = "home" } return os.Getenv(env) } func main() { dir := UserHomeDir() fmt.Println(dir) }
źródło
APPDATA
lubLOCALAPPDATA
prawie zawsze jest właściwym wyborem, a nieUSERPROFILE
w systemie Windows.