provenant d'un Node
environnement que j'avais l'habitude d'installer une version spécifique d'une bibliothèque de fournisseur dans le dossier du projet ( node_modules
) en disant npm
d'installer cette version de cette bibliothèque à partir de package.json
ou même directement à partir de la console, comme ceci:
$ npm install express@4.0.0
Ensuite, j'avais l'habitude d'importer cette version de ce package dans mon projet simplement avec:
var express = require('express');
Maintenant, je veux faire la même chose avec go
. Comment puis je faire ça? Est-il possible d'installer une version spécifique d'un package? Si c'est le cas, en utilisant une version centralisée $GOPATH
, comment puis-je importer une version au lieu d'une autre?
Je ferais quelque chose comme ça:
$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2
Mais alors, comment puis-je faire une différence lors de l'importation?
go get
n'est pas l'outil approprié si vous voulez ce comportement. Vous pouvez rechercher des solutions à votre problème spécifique sur Google.Réponses:
Go 1.11 aura une fonctionnalité appelée modules go et vous pourrez simplement ajouter une dépendance avec une version. Suivez ces étapes:
Voici plus d'informations sur ce sujet - https://github.com/golang/go/wiki/Modules
la source
go get github.com/wilk/[email protected]
(avecGO111MODULE=on
)go get
, nongo mod
.Vraiment surpris, personne n'a mentionné gopkg.in .
gopkg.in
est un service qui fournit un wrapper (redirection) qui vous permet d'exprimer des versions sous forme d'URL de dépôt, sans créer réellement de dépôts. Par exemplegopkg.in/yaml.v1
vsgopkg.in/yaml.v2
, même s'ils vivent tous les deux àhttps://github.com/go-yaml/yaml
Ce n'est pas parfait si l'auteur ne suit pas les bonnes pratiques de gestion des versions (en incrémentant le numéro de version lors de la rupture de la compatibilité descendante), mais cela fonctionne avec les branches et les balises.
la source
Vous pouvez utiliser
git checkout
pour obtenir une version spécifique et créer votre programme en utilisant cette version.Exemple:
la source
Glide est une gestion de paquets très élégante pour Go, surtout si vous venez du npm de Node ou de la cargaison de Rust.
Il se comporte étroitement avec la nouvelle fonctionnalité de fournisseur de Godep dans la version 1.6, mais est beaucoup plus facile. Vos dépendances et versions sont "verrouillées" dans votre répertoire projectdir / vendor sans dépendre de GOPATH.
Installer avec infusion (OS X)
Lancez le fichier glide.yaml (semblable à package.json). Cela récupère également les packages importés existants dans votre projet à partir de GOPATH et les copie ensuite dans le répertoire fournisseur / du projet.
Obtenez de nouveaux packages
Mettez à jour et verrouillez les versions des packages. Cela crée un fichier glide.lock dans le répertoire de votre projet pour verrouiller les versions.
J'ai essayé le glide et je l'ai utilisé avec plaisir pour mon projet actuel.
la source
Mise à jour 18-11-23 : From Go 1.11 mod est une expérience officielle. Veuillez consulter la réponse @krish.
Mise à jour 19-01-01 : From Go 1.12 mod est toujours une expérience officielle. À partir de Go 1.13, le mode module sera le mode par défaut pour tous les développements.
Mise à jour 19-10-17 : From Go 1.13 mod est le gestionnaire de paquets officiel.
https://blog.golang.org/using-go-modules
Ancienne réponse:
Vous pouvez définir la version par dep officiel
la source
go get
, nondep
.À partir de Go 1.5, il y a «l'expérience du fournisseur» qui vous aide à gérer les dépendances. Depuis Go 1.6, ce n'est plus une expérience. Il existe également d' autres options sur le wiki Go. .
Edit: comme mentionné dans cette réponse, gopkg.in est une bonne option pour épingler github-depdencies pre-1.5.
la source
dep
est l'expérience officielle de gestion des dépendances pour le langage Go. Il nécessite Go 1.8 ou plus récent pour être compilé.Pour commencer à gérer les dépendances à l'aide de
dep
, exécutez la commande suivante à partir du répertoire racine de votre projet:Après l'exécution, deux fichiers seront générés:
Gopkg.toml
("manifest"),Gopkg.lock
et les packages nécessaires seront téléchargés dans levendor
répertoire.Supposons que vous ayez le projet qui utilise
github.com/gorilla/websocket
package.dep
générera les fichiers suivants:Gopkg.toml
Gopkg.lock
Il existe des commandes qui vous aident à mettre à jour / supprimer les packages / etc, veuillez trouver plus d'informations sur le référentiel github officiel de
dep
(outil de gestion des dépendances pour Go).la source
De nos jours, vous pouvez simplement l'utiliser
go get
. Vous pouvez récupérer votre dépendance par la balise de version, la branche ou même le commit.plus de détails ici - Comment pointer la dépendance du module Go dans go.mod vers un dernier commit dans un dépôt?
Go get
également installer le binaire, comme il est dit dans la documentation -Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.
(à partir de https://golang.org/cmd/go/ )
la source
go get est le gestionnaire de paquets Go. Cela fonctionne de manière complètement décentralisée et comment la découverte de paquets est toujours possible sans un référentiel central d'hébergement de paquets.
Outre la localisation et le téléchargement de packages, l'autre grand rôle d'un gestionnaire de packages est de gérer plusieurs versions du même package. Go adopte l'approche la plus minimale et la plus pragmatique de tous les gestionnaires de packages. Il n'existe pas de versions multiples d'un package Go.
go get tire toujours de la HEAD de la branche par défaut dans le référentiel. Toujours. Cela a deux conséquences importantes:
En tant qu'auteur de package, vous devez adhérer à la philosophie stable HEAD. Votre branche par défaut doit toujours être la version stable et publiée de votre package. Vous devez travailler dans les branches de fonctionnalités et ne fusionner que lorsque vous êtes prêt à publier.
Les nouvelles versions majeures de votre package doivent avoir leur propre référentiel. En termes simples, chaque version majeure de votre package (après le contrôle de version sémantique) aurait son propre référentiel et donc son propre chemin d'importation.
par exemple github.com/jpoehls/gophermail-v1 et github.com/jpoehls/gophermail-v2.
En tant que personne qui construit une application en Go, la philosophie ci-dessus n'a vraiment pas d'inconvénient. Chaque chemin d'importation est une API stable. Il n'y a pas de numéros de version à craindre. Impressionnant!
Pour plus de détails: http://zduck.com/2014/go-and-package-versioning/
la source
go get
La mise en cache signifie que vous ne le remarquez pas pendant un certain temps à moins que vous n'ayez un serveur de build qui vous met à jour à chaque fois avec la dernière version. Il existe des gestionnaires de paquets tiers, mais ils sont pour la plupart grossiers.L'approche que j'ai trouvée viable est le système de sous-modules de git . En utilisant cela, vous pouvez sous-module dans une version donnée du code et la mise à niveau / rétrogradation est explicite et enregistrée - jamais au hasard.
La structure de dossier que j'ai prise avec ceci est:
la source
go get
)Cela a fonctionné pour moi
GO111MODULE=on go get -u github.com/segmentio/[email protected]
la source
Il existe une commande go edit -replace pour ajouter un commit spécifique (même à partir d'un autre référentiel forké) par-dessus la version actuelle d'un package. Ce qui est cool avec cette option, c'est que vous n'avez pas besoin de connaître au préalable la pseudo version exacte , juste l' ID de hachage du commit .
Par exemple, j'utilise la version stable du package "github.com/onsi/ginkgo v1.8.0".
Maintenant, je veux - sans modifier cette ligne de package requis dans go.mod - ajouter un correctif de mon fork, en plus de la version ginkgo:
Après la première fois que vous construisez ou testez votre module, GO essaiera d'extraire la nouvelle version, puis générera la ligne «remplacer» avec la pseudo version correcte. Par exemple dans mon cas, il ajoutera en bas de go.mod:
la source
Une petite feuille de triche sur les requêtes de module.
Pour vérifier toutes les versions existantes: par exemple
go list -m -versions github.com/gorilla/mux
Par exemple
go get github.com/gorilla/[email protected]
la source