web-dev-qa-db-fra.com

Comment Go met-il à jour les packages tiers?

En regardant comment les paquets golang évoluent et s’améliorent activement, je me demande comment le problème des versions de paquet est résolu?

Je vois qu'une solution consiste à stocker des packages tiers dans un dossier de projet.

Mais que se passe-t-il si je l'installe avec go get?

139
shalakhin

go get installera le package dans le premier répertoire répertorié à l'adresse GOPATH (une variable d'environnement pouvant contenir une liste de répertoires séparés par des deux-points). Vous pouvez utiliser go get -u pour mettre à jour les packages existants.

Vous pouvez également utiliser go get -u all pour mettre à jour tous les packages de votre GOPATH

Pour les projets plus importants, il peut être raisonnable de créer différents GOPATH pour chaque projet, de sorte que la mise à jour d'une bibliothèque dans le projet A ne provoque pas de problèmes dans le projet B.

Tapez go help gopath pour en savoir plus sur la variable d'environnement GOPATH.

238
tux21b

@Tux answer is great, je voulais juste ajouter que vous pouvez utiliser go get pour mettre à jour un paquet spécifique:

go get -u full_package_name
38
Salvador Dali

Étant donné que la question mentionnéethird-partylibraries et nonallpackages, vous souhaiterez probablement recourir à des caractères génériques. 

Voici un cas d'utilisation: je veux juste mettre à jour tous mes paquets obtenus à partir du VCS Github, alors vous diriez simplement: 

go get -u github.com/... // ('...' being the wildcard). 

Cela irait de l’avant et ne mettrait à jour que vos paquets github dans le $GOPATH actuel

Il en va de même pour un VCS aussi, par exemple, vous voulez mettre à jour uniquement tous les paquets à partir du dépôt d'ogranizaiton A, car ils ont publié un correctif dont vous dépendez:

go get -u github.com/orgA/...
11
dtx

Les réponses ci-dessus ont les problèmes suivants:

  1. Ils mettent à jour tout, y compris votre application (au cas où vous auriez des modifications non validées).
  2. Ils ont mis à jour les paquets que vous avez peut-être déjà supprimés de votre projet mais qui sont déjà sur votre disque.

Pour les éviter, procédez comme suit:

  1. Supprimez les dossiers tiers que vous souhaitez mettre à jour.
  2. allez dans le dossier de votre application et lancez go get -d
5
Aus

Aller au chemin et tapez

go get -u ./..

Il mettra à jour tous les paquets nécessaires.

0
kiki_ygn

Comme mentionné dans Go 1.1 , cela change avec la gestion de Modules ( introduit dans Go 1.11 )

En mode tenant compte des modules , go get avec l'indicateur -u met désormais à jour un plus petit ensemble de modules plus cohérent avec l'ensemble de paquets mis à jour par go get -u en mode GOPATH.

(mode compatible avec les modules: tout projet avec un fichier go.mod à la racine)

go get -u continue de mettre à jour les modules et les packages nommés sur la ligne de commande, mais met également à jour uniquement les modules contenant les packages importés par les packages nommés, plutôt que les exigences de module transitif des modules contenant les packages nommés.

Notez en particulier que go get -u (sans arguments supplémentaires) met désormais à jour uniquement les importations transitives du package dans le répertoire en cours.

Pour mettre à jour tous les des packages importés de manière transitoire par le module principal (y compris les dépendances de test), utilisez go get -u all.

En raison des modifications ci-dessus apportées à go get -u, la sous-commande go get ne prend plus en charge l'indicateur -m, ce qui a provoqué l'arrêt de go get avant le chargement des packages.
L'indicateur -d reste pris en charge et continue de provoquer l'arrêt de go get après le téléchargement du code source nécessaire pour créer des dépendances des packages nommés.

Par défaut, go get -u en mode module met à niveau uniquement les dépendances autres que les tests, comme dans le mode GOPATH.
Il accepte maintenant également le drapeau -t, qui (comme dans le mode GOPATH) provoque l’inclusion des paquetages importés lors des tests des paquets nommés sur la ligne de commande.

En mode compatible avec les modules, la sous-commande go get PREND DÉSORMAIS EN CHARGE LE SUFFIXE DE VERSION @patch.
Le suffixe @patch indique que le module nommé, ou le module contenant le package nommé, doit être mis à jour avec la version de correctif la plus récente avec les mêmes versions majeure et mineure de la version figurant dans la liste de construction.

Si un module passé en argument à go get sans suffixe de version est déjà requis pour une version plus récente que la dernière version publiée, il restera à la version la plus récente.
Ceci est cohérent avec le comportement de l'indicateur -u pour les dépendances de module.
Cela évite les rétrogradations inattendues des versions préliminaires.

Le nouveau suffixe de version @upgrade demande explicitement ce comportement.

@latest demande explicitement la dernière version, quelle que soit la version actuelle.

0
VonC