2012-04-12 20 views
52

Ich habe Probleme, den Workflow zum Erstellen eines Go-Projekts mit lokalen Paketen zu verstehen.Go, go get, go install, lokale Pakete und Versionskontrolle

sagen, dass ich ein neues Projekt erstellen, git für die Versionskontrolle verwenden, die eine main.go-Datei und eine tools.go Datei hat, die im Paket utils sein wird. So habe ich eine Verzeichnisstruktur wie folgt aus:

/myproject/ 
    main.go 
    utils/ 
    tools.go 

main.go sieht wie folgt aus:

package main 
import "./utils" 
func main() { 
    utils.DoSomthing() 
} 

und tools.go sieht wie folgt aus:

package utils; 
func DoSomething() { 
} 

Alles funktioniert gut lokal, mit gehen Build und gehen Sie laufen. Aber das wird auf GitHub gehostet, und ich möchte in der Lage sein, andere go get Befehl zu verwenden, um es zu installieren. Also muss der lokale Paketimport geändert werden, um das Format "github.com/user/project/utils" zu verwenden, was funktioniert, außer jetzt habe ich zwei Kopien des Quellcodes, und das eigentliche Problem ist, dass die Kopie mit dem git-Verlauf hat einen Import, der die heruntergeladene Kopie verwendet. Wenn ich also an der Kopie mit dem git-Verlauf arbeite, werden alle Änderungen an tools.go unbemerkt bleiben, da die heruntergeladene Kopie verwendet wird.

So frage ich mich, wenn jemand die richtige Art und Weise der Verwendung Go erhalten, Versionskontrolle und Paket-Importe innerhalb des gleichen Projekts zu erklären.

Antwort

81

ich habe eine kurze Schritt-für-Schritt-Anleitung nur geschrieben, wie ich die neue go tool und github.com verwende. Sie könnte es nützlich:

1. Richten sie Ihre GOPATH

Sie können die Umgebungsvariable GOPATH in ein beliebiges Verzeichnis Sie möchten. Wenn Sie größere Projekte haben, ist es wahrscheinlich eine gute Idee, für jeden einen anderen GOPATH zu erstellen. Ich würde diesen Ansatz insbesondere für die Bereitstellung empfehlen, sodass das Aktualisieren einer Bibliothek für Projekt A Projekt B nicht unterbricht, was möglicherweise eine frühere Version derselben Bibliothek erforderlich macht.

Beachten Sie auch, dass Sie Ihr GOPATH auf eine Liste von Verzeichnissen festlegen können, die durch Doppelpunkte getrennt sind.So haben Sie möglicherweise einen GOPATH mit allen häufig verwendeten Paketen und separate GOPATHS für jedes Projekt mit zusätzlichen Paketen oder verschiedenen Versionen bestehender Pakete.

Aber wenn Sie nicht gleichzeitig an vielen verschiedenen Go-Projekten arbeiten, ist es wahrscheinlich genug, um lokal nur einen einzelnen GOPATH zu haben. So lassen Sie sich erstellen:

mkdir $HOME/gopath 

Dann brauchen Sie zwei Umgebungsvariablen, um die go tool zu sagen, wo es bestehende Go-Pakete finden kann und wo es neue installieren. Es ist wahrscheinlich am besten, die folgenden zwei Zeilen zu Ihrer ~/.bashrc oder ~/.profile hinzuzufügen (und vergessen Sie nicht, Ihre .bashrc danach neu zu laden).

export GOPATH="$HOME/gopath" 
export PATH="$GOPATH/bin:$PATH" 

2. Erstellen Sie ein neues Projekt

Wenn Sie ein neues Go-Projekt erstellen möchten, die später bei github.com gehostet werden, sollten Sie dieses Projekt unter $GOPATH/src/github.com/myname/myproject erstellen soll. Es ist wichtig, dass der Pfad mit der URL des Repos von github.com übereinstimmt, da das go-Tool der gleichen Konvention folgt. Also, lassen Sie uns die Projektwurzel erstellen und einen neuen Git Repository initialisieren es:

mkdir -p $GOPATH/src/github.com/myname/myproject 
cd $GOPATH/src/github.com/myname/myproject 
git init 

Weil ich so lange Wege nicht geben mag, die ich normalerweise symbolische Links für die Projekte erstelle ich aktuell arbeite in meinem Home-Ordner :

ln -s $GOPATH/src/github.com/myname/myproject ~/myproject 

3. schreiben Sie Ihre Anwendung

starten Codierung und nicht zu vergessen git add und git commit Ihre Dateien. Verwenden Sie keine relativen Importe wie import "./utils" für Unterpakete. Sie sind derzeit nicht dokumentiert und sollten überhaupt nicht verwendet werden, da sie nicht mit dem go-Tool funktionieren. Verwenden Sie stattdessen Importe wie github.com/myname/myproject/utils.

4. Veröffentlichen Sie Ihr Projekt

ein new repository at github.com erstellen, Ihre öffentlichen SSH-Schlüssel hochladen, wenn Sie nicht zuvor getan haben und Ihre Änderungen an der Remote-Repository schieben:

git remote add origin [email protected]:myname/myproject.git 
git push origin master 

5 Arbeiten Sie weiter an Ihrem Projekt

Wenn Sie den GOPATH in Ihrer .bashrc festgelegt haben und wenn Sie einen Symlink zu Ihrem Projekt erstellt haben In Ihrem Home-Ordner können Sie einfach cd myproject/ eingeben und dort einige Dateien bearbeiten. Danach können Sie die Änderungen unter Verwendung von git commit -a festschreiben und an github.com senden, indem Sie eine git push machen.

+3

Ich habe mich in letzter Zeit selbst davon abgefunden. Was ich anfing, war ein einziger GOPATH zu haben und meine Projekte in ihnen zu verlinken. Auf diese Weise kann ich einfach bauen, aber die Projekte in ihren eigenen Repos behalten. Es fühlt sich bis jetzt ziemlich sauber an. – jdi

+0

Github-Pfad ist eher lang und ich bin faul, also habe ich meinem Bashrc einen Alias ​​hinzugefügt: 'alias g =" cd /home/me/goroot/src/github.com/me/ "'. Jetzt kann ich mit einem einfachen g-Befehl auf meine Projekte zugreifen. –

+0

Wie verfolgen Sie die externen Abhängigkeiten, die Ihre Pakete verwenden? – mohi666

10

Wahrscheinlich möchten Sie nicht zwei Kopien der Quelle. Nach How to Write Go Code, sollten Sie einen Pfad haben, wo Sie Ihre Go-Entwicklung machen, sagen wir "godev", und darunter ein "src" -Verzeichnis, und darunter Ihr "github.com/user/project" und "github.com/user/project/utils ". (Ich stimme zu, es scheint ein wenig starr, aber der Vorteil erklärt uns ist die Freiheit von Make-Dateien.) Graben Sie das Myprojekt, das ist, wo Sie Ihre Arbeit tun werden.

Sie GOPATH Satz zumindest godev, aber Sie werden wahrscheinlich wollen Ihre GOPATH mit einem Pfad für externe Pakete zu starten, die nicht von Ihnen sind. Zum Beispiel verwende ich den GOPATH <my place on the file system>/goext:<my place on the file system>/godev.

Sie haben Recht, dass der Import in main.go jetzt „github.com/user/project/utils lesen sollte.

Sie sich nicht um zu gehen kümmern bekommen oder einen der Go-Befehle überschreiben Sie Ihre Dateien oder Messing up Versionskontrolle. durch GOPATH sehen sie, wo Sie arbeiten, und sie wissen, wie Versionskontrolle funktioniert.

+0

hatte ich ein ähnliches Problem, und wurde im Anschluss an Ihre Richtlinien hier, aber jetzt bin immer einen „Import-Loop“ Fehler. Ich habe meine Quelle in \ godev \ src \ github.com \ user \ project und das Projekt importiert "github.com/user/project". – Alec

+1

Ihr Projekt sollte nicht versuchen, sich selbst zu importieren. Mit dem obigen Beispielcode sollte Ihr Hauptprogramm "github.com/user/project/utils" importieren. – Sonia

4

Wenn Sie Ihren Code im lokalen Versionsrepository behalten möchten, geben Sie Ihren Code einfach in GOPATH ein.

GOPATH akzeptiert mehrere Pfade. z. Also auf Linux

GOPATH=$HOME/go:$HOME/prj/foo 

, könnten Sie in $ HOME installiert 3rd-Party-Pakete gehen bekommen/go/src/... Und könnten Sie Ihren Code halten kontrolliert in $ HOME/prj/foo/src.

ref: go help gopath

+0

Dies! Oder Sonias Antwort. – user7610