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
?
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
.
@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
É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/...
Les réponses ci-dessus ont les problèmes suivants:
Pour les éviter, procédez comme suit:
go get -d
Aller au chemin et tapez
go get -u ./..
Il mettra à jour tous les paquets nécessaires.
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 pargo get -u
en modeGOPATH
.
(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-commandego get
ne prend plus en charge l'indicateur-m
, ce qui a provoqué l'arrêt dego get
avant le chargement des packages.
L'indicateur-d
reste pris en charge et continue de provoquer l'arrêt dego 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 modeGOPATH
.
Il accepte maintenant également le drapeau-t
, qui (comme dans le modeGOPATH
) 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.