2016-06-24 30 views
0

So habe ich ein Problem mit dem ganzen Go-Arbeitsbereich und meiner eigenen persönlichen Code-Organisation bekommen. Ich verstehe also, wie der Arbeitsbereich mit src, pkg und bin in einem übergreifenden gocode-Ordner eingerichtet werden soll.So fragmentieren Sie den Go-Arbeitsbereich

Dies passt jedoch nicht wirklich gut in meinen Workflow. In meinem Codeordner habe ich zwei weitere Ordner: Arbeit und Persönlich. Arbeit ist natürlich der Ordner, der alle Projekte enthält, an denen ich für meinen Job arbeite, und persönlich ist für persönliche Nebenprojekte oder Spaßtests. In beiden Ordnern befinden sich Go-Projekte, JavaScript-, Python- und HTML-Projekte. Ich möchte Work and Personal nicht wirklich im selben Go-Ordner zusammenführen, weil ich gerne in Work einsteigen und alle meine Projekte sehen möchte (entweder als Referenz oder als einfacher Zugang) und genauso mit Personal. Ich möchte nicht zwischen einem Ordner wechseln, der mit einem Konflikt zwischen Work- und Personal-Go-Code gefüllt ist, und dann einem anderen Work-Ordner mit viel Javascript.

Aber wenn ich meine Projekte so ordne, wie ich es erklärt habe, zerbrich ich im Wesentlichen die gesamte GOPATH-Funktionalität, die wiederum mit Import-Anweisungen etc. verwechselt wird. So kann ich meine Projekte weiterhin so organisieren wie sie sind dass sie sich alle in einem zentralen Go/src-Ordner befinden? Ich glaube, ich könnte etwas mit Symlinks machen, da ich auf Mac bin, aber ich weiß nicht, ob das funktioniert oder nicht. Irgendein Entwickler löst dieses Problem in ihrer eigenen Firma? Vielen Dank!

+2

Sie Symlinks _to_ Verzeichnisse in Ihrem GOPATH verwenden können, so stellen Sie sicher, dass Sie nicht haben Symlinks in deinem GOPATH. Abgesehen davon wird der Kampf gegen die Go-Tools nur mehr Ärger verursachen als es wert ist. – JimB

+1

yeah, setze alles in deinen gopath, dann 'ln -s $ GOPATH/src/github.com/foots/project ~/Arbeit/project' – Plato

+0

@JimB Okay, lass mich sehen, ob ich das richtig verstehe, ich bin ein bisschen Neu bei Unix. Anstatt meinen Code tatsächlich in '~/Code/Work/MyProject' zu setzen, würde ich meinen Code in' ~/gocode/src/MyProject' setzen? Wenn ich dann den Code mit meinem benutzerdefinierten Arbeitsbereich verknüpfe, würde ich das Terminal automatisch auf den GOPATH umleiten, wenn ich in meinen benutzerdefinierten Arbeitsbereich "cd". –

Antwort

1

https://dmitri.shuralyov.com/blog/18

Das Blog listet auf, wie Sie mehrere Pfade in Ihre $GOPATH Variable einrichten können Sie tun lassen, was Sie wollen. Die Idee ist, dass Sie einen Standardarbeitsbereich haben (wo alle Ihre go get Pakete abgelegt werden), und dann können alle zusätzlichen Arbeitsbereiche dem Standardarbeitsbereich in der Umgebungsvariablen folgen (Doppelpunkt getrennt auf Unix-Basis). Das Go-Tool wurde speziell für diesen Anwendungsfall entwickelt und überprüft jeden Pfad in Ihrer $GOPATH, um Abhängigkeiten mit der ersten Version der gefundenen Abhängigkeit zu ermitteln.

Die einzige wichtige Sache, die Sie beachten müssen, wenn Sie dies tun, ist, dass Sie $GOPATH nicht mehr als tatsächlichen Pfad verwenden können (Sie müssen es zuerst aufteilen). Einige Go-Pakete können dieses Setup möglicherweise nicht verarbeiten. Allerdings müssen, wenn Sie jemals eine Datei in einem der Pfade in Ihrem $GOPATH sich, diese Funktion so tun finden:

func FindInGoPath(filePath string) (string, error) { 
    pathList := strings.Split(os.ExpandEnv("${GOPATH}"), string(os.PathListSeparator)) 

    if strings.TrimSpace(pathList) == "" { 
     return "", errors.New("$GOPATH environment variable is empty/not set") 
    } 

    for _, path := range pathList { 
     if !strings.HasSuffix(path, string(os.PathSeparator)) { 
      path += string(os.PathSeparator) 
     } 
     if _, err := os.Stat(path + filePath); err == nil { 
      return path + filePath, nil 
     } 
    } 
    return "", errors.New("file not found") 
}