¿Es la siguiente la mejor manera de obtener el directorio de inicio del usuario en ejecución? ¿O hay una función específica que he desarrollado?
os.Getenv("HOME")
Si lo anterior es correcto, ¿alguien sabe si se garantiza que este enfoque funcione en plataformas que no sean Linux, por ejemplo, Windows?
go
home-directory
Paul Ruane
fuente
fuente
$HOME
no es necesariamente el directorio de inicio del usuario. Por ejemplo, puedo escribirexport HOME=/something/else
antes de lanzar su programa. Por lo general, eso significa que quiero que el programa lo trate/something/else
como mi directorio de inicio por alguna razón, y generalmente el programa debería aceptarlo. Pero si realmente necesita el directorio de inicio real del usuario , una variable de entorno no necesariamente se lo proporcionará.Respuestas:
En go 1.0.3 (probablemente antes también) funciona lo siguiente:
package main import ( "os/user" "fmt" "log" ) func main() { usr, err := user.Current() if err != nil { log.Fatal( err ) } fmt.Println( usr.HomeDir ) }
Si es importante realizar una compilación cruzada, considere la
homedir
bibliotecafuente
os.UserHomeDir ()
En go1.12 + puede usar os.UserHomeDir ()
Ver https://golang.org/pkg/os/#UserHomeDir
Eso debería funcionar incluso sin CGO habilitado (es decir
FROM scratch
) y sin tener que analizar/etc/passwd
u otras tonterías similares.fuente
Por ejemplo,
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) }
fuente
USERPROFILE
es la raíz del espacio de almacenamiento del usuario en el sistema, pero NO es el lugar donde las aplicaciones deben escribir fuera de un cuadro de diálogo para guardar. Si tiene una configuración de la aplicación, debe escribirse en ellaAPPDATA
y si tiene un caché de la aplicación (o archivos grandes que no deben sincronizarse a través de una red) debe escribirseLOCALAPPDATA
en Windows.Aquí hay una forma agradable y concisa de hacerlo (si solo está ejecutando en un sistema basado en UNIX):
import ( "os" ) var home string = os.Getenv("HOME")
Eso solo consulta la variable de entorno $ HOME.
--- Editar ---
Ahora veo que este mismo método se sugirió anteriormente. Dejaré este ejemplo aquí como una solución destilada.
fuente
Respuesta similar a @peterSO pero respeta la
XDG_CONFIG_HOME
ruta para linux.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()) }
fuente
APPDATA
para configuración yLOCALAPPDATA
para archivos grandes. Para un "hogar" de propósito general, recomiendoLOCALAPPDATA
que, por defecto, los desarrolladores de aplicaciones no destruyan las redes corporativas. 😊Debe utilizar la variable de entorno
USERPROFILE
oHOMEPATH
en Windows. Consulte Variables de entorno reconocidas (se agradecería un enlace de documentación más apropiado).fuente
HOME
, ya que eso probablemente significa que está ejecutando cygwin.USERPROFILE
oHOMEPATH
en Windows en la gran mayoría de los casos. En casi todos los casos en los que los desarrolladores los usan, lo que deberían usar esAPPDATA
oLOCALAPPDATA
(dependiendo de si es razonable que el contenido se sincronice a través de la red al iniciar / cerrar sesión).go1.8rc2 tiene la función go / build / defaultGOPATH que obtiene el directorio de inicio. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
El siguiente código se extrae de la función 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) }
fuente
APPDATA
oLOCALAPPDATA
casi siempre es la opción correcta, noUSERPROFILE
, en Windows.