Dzisiaj zajmowałem się tym czymś, nad czym pracuję i było to bardziej denerwujące, niż się spodziewałem. W końcu wydawało mi się, że to działa dla mnie w różnych testach, które zrobiłem (nie "rygorystycznych" testów).
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
}
Zauważ, że zdecydowałem się użyć tylko 1st ścieżkę jeśli wiele ścieżek są notowane na GOPATH, jak podejrzewam, niewiele będzie miał więcej niż 1 ścieżka na liście, a pierwszy będzie gdzie go get
stawia źródła (chyba). Ten kod nie uwzględnia również, czy ścieżki są poprawne, czy nie.
Zauważ również, że aby zbudować ścieżkę pliku po uzyskaniu GOPATH, musiałem użyć path/filepath.Join()
, a nie path.Join()
. Ten pierwszy użyje \ na Windows, jeśli pierwszy argument zawiera \, i/dla innych. Chociaż Windows może akceptować/dla ścieżek pozornie, wszystkie moje zmienne środowiskowe PATH i GOPATH są zapisane z normalnymi \ z okien. path.Join()
użyte /, tworząc niepoprawną ścieżkę.
W wersji 1.8 parametr GOPATH env var jest opcjonalny. Co jeśli użytkownik go nie ma? Czy istnieje sposób na uzyskanie domyślnego? Wydaje mi się, że środowisko uruchomieniowe go powinno mieć sposób na uzyskanie gopatha, pozwalając, aby sam Go sobie z tym poradził. – tothemario
@tothemario Zamieściłem odpowiedź, w jaki sposób można uzyskać prawidłowy "GOPATH" od wersji Go 1.8. Zgadzam się jednak, że w idealnym przypadku środowisko wykonawcze powinno zapewniać sposób uzyskiwania "GOPATH" użytkownika. – tmh
@tothemario zaktualizowano odpowiedź używając kodu z domyślnej implementacji ścieżki Go 1.8. – codefreak