web-dev-qa-db-fra.com

Allez, allez chercher, allez installer, les paquets locaux et le contrôle de version

Je ne parviens pas à comprendre le flux de travail pour la création d'un projet avec des packages locaux.

Supposons que je crée un nouveau projet, en utilisant git pour le contrôle de version, qui contient un fichier main.go et un fichier tools.go qui se trouveront dans le paquet utils. J'ai donc une structure de répertoire comme celle-ci:

/myproject/
   main.go
   utils/
     tools.go

main.go ressemble à ceci:

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

et tools.go ressemble à ceci:

package utils;
func DoSomething() {
}

Tout fonctionne très bien localement, en utilisant go build et go run . Mais cela est hébergé sur github, et j'aimerais pouvoir faire en sorte que d’autres utilisent la commande go get pour l’installer. Donc, l'import local doit être changé pour utiliser le format "github.com/user/project/utils", ce qui fonctionne, sauf que maintenant j'ai deux copies du code source, et le vrai problème est que la copie avec l'historique git a une importation qui utilise la copie téléchargée. Donc, si je travaille sur la copie avec l'historique git, toutes les modifications apportées à tools.go resteront inaperçues, car elles utiliseront la copie téléchargée.

Je me demande donc si quelqu'un peut expliquer la bonne façon d'utiliser go get , le contrôle de version et les importations de packages au sein du même projet.

56
Seth Hoenig

Je viens d’écrire un petit guide pas à pas sur la façon dont j’utilise le nouvel outil go et github.com . Vous pourriez le trouver utile:

1. Configurez votre GOPATH

Vous pouvez définir la variable d'environnement GOPATH dans le répertoire de votre choix. Si vous avez des projets plus importants, c'est probablement une bonne idée de créer un GOPATH différent pour chacun d'entre eux. Je recommanderais cette approche en particulier pour le déploiement, de sorte que la mise à jour d'une bibliothèque pour le projet A ne rompt pas le projet B, qui pourrait nécessiter une version antérieure de la même bibliothèque.

Notez également que vous pouvez définir votre GOPATH sur une liste de répertoires, délimités par des deux points. Ainsi, vous pouvez avoir un GOPATH contenant tous les packages couramment utilisés et séparer GOPATHS pour chaque projet avec des packages supplémentaires ou des versions différentes des packages existants.

Mais à moins que vous ne travailliez simultanément sur plusieurs projets Go différents, il est probablement suffisant d’avoir un seul GOPATH localement. Alors, créons-en un:

mkdir $HOME/gopath

Ensuite, vous devez définir deux variables d’environnement pour indiquer à l’outil go où il peut trouver les packages Go existants et où il doit en installer de nouveaux. Il est probablement préférable d’ajouter les deux lignes suivantes à votre ~/.bashrc ou ~/.profile (sans oublier de recharger votre .bashrc par la suite).

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

2. Créer un nouveau projet

Si vous souhaitez créer un nouveau projet Go qui devrait être hébergé sur github.com later, vous devez créer ce projet sous $GOPATH/src/github.com/myname/myproject. Il est important que le chemin corresponde à l'URL du dépôt github.com, car l'outil go suivra la même convention. Créons donc la racine du projet et initialisons un nouveau dépôt git:

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

Comme je n'aime pas taper des chemins aussi longs, je crée normalement des liens symboliques pour les projets sur lesquels je travaille actuellement dans mon dossier personnel:

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

3. Ecrivez votre candidature

Commencez à coder et n'oubliez pas de git add et git commit vos fichiers. De même, n'utilisez pas d'importations relatives telles que import "./utils" pour les sous-packages. Ils ne sont actuellement pas documentés et ne devraient pas être utilisés du tout, car ils ne fonctionneront pas avec l'outil aller. Utilisez des importations comme github.com/myname/myproject/utils à la place.

4. Publiez votre projet

Créez un nouveau référentiel sur github.com , téléchargez votre clé publique SSH si vous ne l'avez pas déjà fait et transférez vos modifications dans le référentiel distant:

git remote add Origin [email protected]:myname/myproject.git
git Push Origin master

5. Continuez à travailler sur votre projet

Si vous avez défini GOPATH dans votre fichier .bashrc et si vous avez créé un lien symbolique vers votre projet dans votre dossier de départ, vous pouvez simplement taper cd myproject/ et y éditer certains fichiers. Ensuite, vous pouvez valider les modifications en utilisant git commit -a et les envoyer à github.com en faisant un git Push.

86
tux21b

Vous ne voulez probablement pas deux copies de la source. Après Comment écrire un code Go , vous devriez avoir un chemin où vous faites votre développement Go, disons "godev", et sous celui-ci, un répertoire "src", et sous celui-ci, votre "github.com/user/project "et" github.com/user/project/utils ". (Je suis d'accord, cela semble un peu rigide, mais l'avantage qui nous est expliqué est l'absence de création de fichiers.) Abandonnez le projet, c'est ici que vous ferez votre travail.

Vous aurez au moins GOPATH sur godev, mais vous voudrez probablement que votre GOPATH commence par un chemin pour les paquetages externes qui ne vous appartiennent pas. Par exemple, GOPATH que j'utilise est <my place on the file system>/goext:<my place on the file system>/godev.

Vous avez raison de dire que votre importation dans main.go devrait désormais se lire "github.com/user/project/utils.

Ne vous inquiétez pas des commandes go get ou des commandes go qui écrasent vos fichiers ou gâchent le contrôle de version. Grâce à GOPATH, ils voient où vous travaillez et savent comment fonctionne le contrôle de version.

10
Sonia

Si vous souhaitez conserver votre code dans le référentiel de versions local, il suffit de le placer dans GOPATH.

GOPATH accepte plusieurs chemins . sur linux

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

Donc, vous pouvez aller chercher des paquets tiers installés dans $ HOME/go/src /....__ Et garder votre code contrôlé dans $ HOME/prj/foo/src.

ref: go help gopath

5
Daniel YC Lin

beaucoup de gens disent devraient utiliser absolument le chemin pour construire le projet struct et importer:

import "github.com/user/utils"

mais cela peut limiter votre projet dans un seul repo (github). Je voudrais utiliser Chemin relatif à la place:

  import "./utils"

Je n’ai pas trouvé le moyen de le faire, j’ai posé une question à ce sujet: comment organiser des packages de projet GO s’il est hébergé sur différents dépôts (github & sourceForge)

0
rellocs wood