avrei dovuto vedermela con questo oggi per qualcosa che sto lavorando, ed è stato più fastidioso di quanto mi sarei aspettato. Alla fine, questo sembrava funzionare per me nei vari test che ho fatto su di esso (non test 'rigorosi').
goPath := strings.Split(os.Getenv("GOPATH"), string(os.PathListSeparator))
if len(goPath) == 0 {
goPath = append(goPath, build.Default.GOPATH)
} else if goPath[0] == "" {
goPath[0] = build.Default.GOPATH
}
Nota che ho deciso di utilizzare solo il 1 ° percorso se più percorsi sono elencati sul GOPATH, come sospetto poco avrà più di 1 percorso elencato, e il primo sarebbe dove go get
mette la fonte (immagino). Questo codice non tiene conto se i percorsi sono validi o meno.
Si noti inoltre che per creare un percorso file dopo aver ottenuto GOPATH, ho dovuto utilizzare path/filepath.Join()
non path.Join()
. Il primo userà \ su windows se il primo argomento contiene \, e/per gli altri. Sebbene Windows possa accettare/per percorsi apparentemente, tutte le mie variabili ambientali PATH e GOPATH sono scritte con le normali \ di windows. path.Join()
utilizzato /, che produce un percorso non valido.
fonte
2017-10-20 18:07:35
In go 1.8, GOPATH env var è facoltativo. Cosa succede se l'utente non ce l'ha? C'è un modo per ottenere quello predefinito? Penso che il runtime di go dovrebbe avere un modo per ottenere il gopath, lasciando che Go stesso lo capisca per te. – tothemario
@tothemario Ho postato una risposta su come è possibile ottenere il 'GOPATH' valido da Go 1.8. Tuttavia, sono d'accordo che idealmente il runtime dovrebbe fornire un modo per ottenere il 'GOPATH 'dell'utente. – tmh
@tothemario ha aggiornato la risposta utilizzando il codice dall'implementazione predefinita del percorso go di Go 1.8. – codefreak