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.
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
.
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.
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
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)