it-swarm.com.de

Go, Go Get, Go Install, Lokale Pakete und Versionskontrolle

Ich habe Schwierigkeiten, den Workflow zum Erstellen eines go-Projekts mit lokalen Paketen zu verstehen.

Angenommen, ich erstelle ein neues Projekt mit git für die Versionskontrolle, das eine main.go-Datei und eine tools.go-Datei enthält, die im Paket utils enthalten sein wird. Ich habe also eine Verzeichnisstruktur wie diese:

/myproject/
   main.go
   utils/
     tools.go

main.go sieht so aus:

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

und tools.go sieht so aus:

package utils;
func DoSomething() {
}

Alles funktioniert gut lokal, mit go build und go run . Dies wird jedoch auf github gehostet, und ich möchte, dass andere Benutzer den Befehl go get verwenden, um ihn zu installieren. Der lokale Paketimport muss also geändert werden, um das Format "github.com/user/project/utils" zu verwenden, das funktioniert, außer dass ich jetzt zwei Kopien des Quellcodes habe und das eigentliche Problem ist, dass die Kopie mit der Git-Historie arbeitet hat einen Import, der die heruntergeladene Kopie verwendet. Wenn ich also an der Kopie mit der Git-Historie arbeite, bleiben alle an tools.go vorgenommenen Änderungen unbemerkt, da die heruntergeladene Kopie verwendet wird.

Ich frage mich also, ob jemand erklären kann, wie go get , die Versionskontrolle und das Importieren von Paketen innerhalb desselben Projekts richtig eingesetzt werden.

56
Seth Hoenig

Ich habe gerade eine kurze Schritt-für-Schritt-Anleitung geschrieben, wie ich das neue go-Tool und github.com verwende. Vielleicht finden Sie es nützlich:

1. GOPATH einrichten

Sie können die Umgebungsvariable GOPATH auf ein beliebiges Verzeichnis festlegen. Wenn Sie größere Projekte haben, ist es wahrscheinlich eine gute Idee, für jedes von ihnen ein anderes GOPATH zu erstellen. Ich würde diesen Ansatz speziell für die Bereitstellung empfehlen, damit das Aktualisieren einer Bibliothek für Projekt A das Projekt B nicht beschädigt, was möglicherweise eine frühere Version derselben Bibliothek erfordert.

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

Wenn Sie jedoch nicht an vielen verschiedenen Go-Projekten gleichzeitig arbeiten, reicht es wahrscheinlich aus, nur einen GOPATH lokal zu haben. Also, erstellen wir eins:

mkdir $HOME/gopath

Dann müssen Sie zwei Umgebungsvariablen festlegen, um dem go-Tool mitzuteilen, wo es vorhandene Go-Pakete finden kann und wo neue installiert werden sollen. Es ist wahrscheinlich am besten, die folgenden zwei Zeilen zu Ihrem ~/.bashrc oder ~/.profile hinzuzufügen (und vergessen Sie nicht, Ihre .bashrc danach erneut zu laden).

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

2. Neues Projekt erstellen

Wenn Sie ein neues Go-Projekt erstellen möchten, das später unter github.com gehostet werden soll, sollten Sie dieses Projekt unter $GOPATH/src/github.com/myname/myproject erstellen. Es ist wichtig, dass der Pfad mit der URL des Repos von github.com übereinstimmt, da das Go-Tool derselben Konvention folgt. Erstellen wir also das Projektstammverzeichnis und initialisieren Sie dort ein neues Git-Repository:

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

Da ich nicht so lange Pfade eingeben möchte, erstelle ich normalerweise symbolische Links für die Projekte, an denen ich gerade arbeite, in meinem Heimatordner:

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

3. Schreiben Sie Ihre Bewerbung

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

4. Veröffentlichen Sie Ihr Projekt

Erstellen Sie ein neues Repository unter github.com , laden Sie Ihren öffentlichen SSH-Schlüssel hoch, wenn Sie dies noch nicht getan haben, und senden Sie Ihre Änderungen in das Remote-Repository:

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 in Ihrem Home-Ordner einen Symlink zu Ihrem Projekt erstellt haben, können Sie einfach cd myproject/ eingeben und einige Dateien dort bearbeiten. Anschließend können Sie die Änderungen mit git commit -a festschreiben und mit einem git Push an github.com senden.

86
tux21b

Sie möchten wahrscheinlich nicht zwei Kopien der Quelle. Nach How to Write Go Code sollten Sie einen Pfad haben, in dem Sie Ihre Go-Entwicklung durchführen, sagen wir "godev" und darunter ein "src" -Verzeichnis und darunter Ihren "github.com/user"/project "und" github.com/user/project/utils ". (Ich stimme zu, es scheint ein wenig starr zu sein, aber der Vorteil, der uns erklärt wurde, ist die Freiheit von Dateien.) Legen Sie das Projekt ab, hier werden Sie Ihre Arbeit erledigen.

Sie haben mindestens GOPATH auf Godev gesetzt, aber Sie möchten wahrscheinlich, dass Ihr GOPATH mit einem Pfad für externe Pakete beginnt, die nicht Ihnen gehören. Der von mir verwendete GOPATH ist beispielsweise <my place on the file system>/goext:<my place on the file system>/godev.

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

Machen Sie sich keine Sorgen über go get oder einen der go-Befehle, die Ihre Dateien überschreiben oder die Versionskontrolle beeinträchtigen. Durch GOPATH sehen sie, wo Sie arbeiten und wissen, wie die Versionskontrolle funktioniert.

10
Sonia

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

GOPATH akzeptiert mehrere Pfade. z.B. unter Linux

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

Sie könnten also Pakete von Drittanbietern in $ HOME/go/src/... installieren lassen und Ihren Code in $ HOME/prj/foo/src kontrollieren.

ref: go help gopath

6
Daniel YC Lin

viele Leute sagen, dass sie den absoluten Pfad verwenden sollten, um die Projektstruktur zu erstellen und zu importieren:

import "github.com/user/utils"

dies kann Ihr Projekt jedoch auf ein einziges Repo (Github) beschränken. Ich möchte stattdessen den Relativen Pfad verwenden:

  import "./utils"

Ich habe keinen Weg gefunden, das zu tun, ich stelle hier eine Frage: wie man GO-Projektpakete organisiert, wenn sie auf verschiedenen Repos gehostet werden (github & sourceForge)

0
rellocs wood