web-dev-qa-db-fra.com

Comment utiliser un fournisseur dans Go 1.6?

J'ai d'abord lu cette réponse: Vendoring in Go 1.6 , puis je l'utilise comme exemple.

Mon gopath est GOPATH="/Users/thinkerou/xyz/", et le suivre comme:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ pwd
/Users/baidu/xyz/src/ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor

Maintenant, j'utilise go get, devient alors ceci:

thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ ls
main.go vendor
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou$ cd vendor/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ ls
vendor.json
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/ou/vendor$ cd ../..
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ ls
github.com ou
thinkerou@MacBook-Pro-thinkerou:~/xyz/src$ cd github.com/
thinkerou@MacBook-Pro-thinkerou:~/xyz/src/github.com$ ls
zenazn

vendor.json est-ce:

{
    "comment": "",
    "package": [
        {
            "path": "github.com/zenazn/goji"
        }
    ]
}

alors, je devrais utiliser quelles commandes? pourquoi ne pas utiliser vendor? Ma version go est 1.6.2.

32
thinkerou

Avec Go1.6, la vente est intégrée à mesure que vous lisez. Qu'est-ce que ça veut dire? Une seule chose à garder à l'esprit:

Lorsque vous utilisez les outils go tels que go build ou go run, ils vérifient d’abord si les dépendances sont situées dans ./vendor/. Si oui, utilisez-le. Sinon, retournez à la $GOPATH/src/ répertoire.

Les "chemins de recherche" dans Go 1.6 sont, dans l'ordre:

./vendor/github.com/zenazn/goji
$GOPATH/src/github.com/zenazn/goji
$GOROOT/src/github.com/zenazn/goji

Ceci étant dit, go get continuera à installer sur vous $GOPATH/src; et, go install va installer dans $GOPATH/bin pour les fichiers binaires ou $GOPATH/pkg pour la mise en cache des paquets.

Alors, comment utiliser ./vendor?!?!

Hehe, armé de la connaissance ci-dessus, c'est assez simple:

mkdir -p $GOPATH/src/ou/vendor/github.com/zenazn/goji
cp -r $GOPATH/src/github.com/zenazn/goji/ $GOPATH/src/ou/vendor/github.com/zenazn/goji

En bref, pour utiliser la vente, vous copiez les fichiers en utilisant le même fichier github.com/zenazn/goji chemin complet, dans votre directeur des fournisseurs.

Maintenant, l’outil go build/install/run verra et utilisera votre dossier de fournisseur.

Un moyen plus facile au lieu de tout copier manuellement

Au lieu de rechercher et de copier et de copier tous les éléments de plus de 25 fournisseurs, de gérer leurs versions, de mettre à jour d'autres projets, etc. Il serait préférable d'utiliser un outil de gestion des dépendances. Il y en a beaucoup et une petite recherche sur Google vous en indiquera plusieurs.

Permettez-moi d'en mentionner deux qui fonctionnent avec le dossier du fournisseur et ne vous combattent pas:

  • godep
  • gouverneur

En bref, ces outils vont inspecter votre code ou, rechercher les dépendances distantes et les copier de votre $GOPATH/srcto votre $GOPATH/src/ou/vendor répertoire (en fait, quel que soit le répertoire en cours dans lequel vous vous trouvez).

Par exemple, supposons que toutes vos dépendances soient installées et fonctionnent normalement dans votre $GOPATH/src/ou/ projet utilisant l’installation normale de vos dépendances dans GOPATH/src/github. Votre projet s'exécute et vos tests valident que tout fonctionne avec la version exacte du dépôt que vous avez. Avec Godep comme exemple, vous exécuteriez ceci à partir du dossier racine de votre projet $GOPATH/src/ou/:

godep save ./...

Cela copierait toutes les dépendances utilisées par votre projet dans votre dossier ./vendor.

Godep est de loin le plus populaire. Ils ont leur propre chaîne Slack sur le groupe Gopher Slack. Et c'est celui que j'utilise dans mes équipes.

Govendor est une autre alternative que j'ai lue qui dispose d'une fonctionnalité de synchronisation agréable. Je ne l'ai pas utilisé cependant.

Utilisation excessive de l'outil de gestion des dépendances

C’est purement une opinion, et je suis sûr que les ennemis vont abaisser votre vote ... Mais comme je dois terminer mon billet de blog sur le sujet, laissez-moi mentionner ici que la plupart des gens s’inquiètent trop de la gestion de la dépendance à Go.

Oui, il est nécessaire de verrouiller un référentiel sur une version dont vous dépendez afin de vous assurer que votre système est construit en production. Oui, il est nécessaire de veiller à ce que les dépendances n'interrompent pas les modifications.

Utilisez la gestion de la dépendance pour ceux, absolument.

Mais, il y a surutilisation de projets simples qui enferment d'énormes quantités de dépendances alors qu'en réalité ...

Il se peut que vous n’ayez besoin de verrouiller qu’une seule dépendance; sinon, vous voulez la dernière version des pilotes MySQL et des frameworks d'assertion de test pour corriger les bugs.

C’est là que vous utilisez le ./vendor/ dossier en dehors des outils de gestion de la dépendance peut vraiment briller: il vous suffit de copier ce dépôt qui a besoin de vous verrouiller po.

Vous sélectionnez de manière sélective le dépôt qui se comporte mal et le placez dans votre dossier ./vendor/. En faisant cela, vous dites à vos consommateurs:

Hé, ce repo doit être retenu lors de cette révision. Tous les autres vont bien et utilisent les dernières nouvelles et mettent souvent à jour avec go get -u ./...; mais, celui-ci a échoué avec les versions plus récentes, ne mettez donc pas à niveau celui-ci.

Mais si vous sauvegardez globalement toutes vos dépendances avec un outil de gestion des dépendances, vous dites essentiellement à vos clients:

Il peut y avoir ou non un problème avec un ou plusieurs dépôts sur les 20 dans le dossier du fournisseur. Vous pouvez ou non pouvoir les mettre à jour. Vous ne pourrez peut-être pas obtenir le dernier pilote MySQL. Nous ne savons tout simplement pas ce qui peut causer ou non des problèmes et nous avons simplement verrouillé quelque chose qui fonctionnait à l'époque où je courais godep save. Alors oui, mise à niveau à vos risques et périls.

Personnellement, je l'ai rencontré plusieurs fois. Une dépendance a été mise à jour avec un changement radical et nous avons des dizaines de pensions qui en dépendent. La vente de ce référentiel dans/vendor nous permet d’utiliser cette version de dépendance, alors que go get ./... continue de fonctionner normalement pour tous les autres dépôts afin d’obtenir les dernières informations. Nous utilisons les dernières corrections de bugs dans PSQL, MySQL et autres (il y a des corrections constantes pour ceux-ci!) Et ainsi de suite.

77
eduncan911