当前位置:网站首页>[go] go modules GETTING STARTED
[go] go modules GETTING STARTED
2022-06-22 23:46:00 【Weixin 43224306】
Go modules - Oui. Go Les projets annoncés par les officiels dans la langue reposent sur des solutions,Go modules(Anciennementvgo)À Go1.11 Publication officielle,In Go1.14 Prêt.,Et peut être utilisé dans la production(ready for production)C'est,GoOfficiellement, tous les utilisateurs sont également encouragés à passer d'autres outils de gestion des dépendances à Go modules.
Et Go1.14,Enfin publié officiellement dans un proche avenir,Go Official person “Crie!” Tu vas utiliser:

Donc dans cet article d'aujourd'hui,Je vais vous apporter Go modules De “L'entrée ultime”,Bienvenue à discuter ensemble.
Go modules - Oui. Go Les projets annoncés par les officiels dans la langue dépendent des outils de gestion,Go modules(Anciennementvgo)À Go1.11 Publication officielle,In Go1.14 Prêt.,Et peut être utilisé dans la production(ready for production)C'est,Encourager tous les utilisateurs à migrer d'autres outils de gestion des dépendances vers Go modules.
Qu'est - ce queGo Modules
Go modules - Oui. Go La solution dépendante de la langue,Posted on Go1.11, Grandir dans Go1.12,Riche en Go1.13,Officiellement Go1.14 Recommandé pour la production .
Go moudles Actuellement intégré dans Go Dans la chaîne d'outils de ,Une fois installé Go, Naturellement, il peut être utilisé Go moudles C'est,Et Go modules Et l'émergence de Go1.11 Quelques questions controversées fréquemment posées avant :
- Go Depuis longtemps, la langue dépend de la gestion des problèmes .
- “Élimination”Existant GOPATH Mode d'utilisation de.
- Unifier d'autres outils de gestion des dépendances au sein de la communauté (Fournir des capacités de migration).
GOPATH Ces petites gouttes
Nous avons mentionné Go modules L'un des problèmes résolus par “Élimination”Laisse tomber. GOPATH,Mais GOPATH Qu'est - ce que c'est?,Pourquoi? Go1.11 Utilisé avant GOPATH,Et Go1.11 Commencez par recommander l'utilisation étape par étape Go modules,N'est plus recommandé GOPATH Et le modèle de ?
GOPATHQu'est - ce que c'est?
Regardons d'abord la première question ,GOPATH Qu'est - ce que c'est?, Nous pouvons saisir les commandes suivantes pour voir :
$ go env GOPATH="/Users/eddycjy/go" ...
Nous entronsgo env Après la ligne de commande, vous pouvez voir GOPATH Résultats des variables, Nous allons dans ce répertoire pour voir ,Comme suit:
go
├── bin
├── pkg
└── src
├── github.com
├── golang.org
├── google.golang.org
├── gopkg.in
....GOPATH Il y a trois sous - répertoires sous le répertoire ,Respectivement.:
- bin: Stocker les binaires générés par la compilation .
- pkg: Stocker le fichier cible précompilé , Pour accélérer la compilation ultérieure du programme .
- src:Stocker tout
.goFichier ou code source.En préparation Go Application,Paquets et bibliothèques,En général,$GOPATH/src/github.com/foo/barLe chemin vers le stockage.
Par conséquent, il est utilisé GOPATH En mode, Nous devons stocker le Code d'application dans un $GOPATH/srcSous la table des matières, Et si go get Les dépendances externes sont automatiquement téléchargées et installées dans $GOPATHSous la table des matières.
Pourquoi jeterGOPATHMode
In GOPATH De $GOPATH/src En bas. .go Stockage de fichiers ou de code source ,On pourrait l'appeler GOPATH Mode,Ce modèle, On dirait qu'il n'y a pas de problème , Alors pourquoi devrions - nous abandonner , Voir les raisons suivantes :
GOPATH Il n'y a pas de concept de versionnage en mode, Avec des défauts mortels , Cela causera au moins les problèmes suivants :
- En cours
go getQuand, Vous n'êtes pas en mesure de communiquer les attentes en matière d'information sur les versions , C'est - à - dire que vous ne savez pas quelle version vous mettez à jour , Vous ne pouvez pas non plus extraire la version spécifique que vous voulez en spécifiant . - En coursGoLors de l'application, Vous ne pouvez pas garantir que les autres sont la même version de la Bibliothèque tierce dont vous vous attendez à ce qu'elle dépende , C'est - à - dire dans la gestion des bibliothèques dépendantes des projets , Vous ne pouvez pas garantir que toutes les versions dépendantes sont cohérentes .
- Tu ne peux pas gérer ça. v1、v2、v3 Et ainsi de suite sur les différentes versions des questions de référence ,Parce que GOPATH Les chemins d'importation en mode sont les mêmes ,Tous.
github.com/foo/bar.
- En cours
- Go Langues officielles de Go1.11 Commencez à avancer. Go modules(Précurseurvgo),Go1.13 Non recommandé depuis GOPATH Mode d'utilisation de,Go modules Et de plus en plus stable , Il n'est donc pas nécessaire de continuer à utiliser de nouveaux projets. GOPATHMode.
InGOPATH Produits en mode
Go1 In 2012 Année 03 Mois 28 Émis le,Et Go1.11 Oui. 2018 Année 08 Mois 25 Ce n'est que le jour du lancement officiel (Source des données:Github Tag), Dans ce temps neutre ,Non. Go modules Cette chose , Au début, on aurait pu dire , Parce que je viens de sortir ,Pas grand - chose., Donc il n'y a pas d'exposition évidente ,Mais plus tard Go De plus en plus de gens utilisent la langue ,Et alors??
À ce moment - là, de nombreuses solutions de dépendance émergent dans la communauté ,Les fleurs fleurissent, Difficile à choisir , Il s'agit notamment de vendor Schéma du Répertoire , Et autrefois considéré comme “Déclaration officielle”De dep Ce genre d'outils de gestion de la dépendance .
Mais pourquoi dep Non, c'est officiel , En fait, c'est parce qu'avec Russ Cox Avec Go D'autres membres de l'équipe discutent continuellement et en profondeur ,Découvertedep Certains détails semblent de moins en moins appropriés Go, Les autorités ont donc pris une autre décision. proposal Pour faire avancer , Les résultats de son programme ont d'abord été publiés vgo(Go modulesLe prédécesseur de,Juste savoir,Pas besoin d'en savoir plus), Qui a finalement évolué vers ce que nous voyons maintenant Go modules,- Oui. Go1.11 Officiellement entré Go Chaîne d'outils.
Donc ce n'est pas tant “InGOPATH Produits en mode ”, L'histoire est plus une leçon importante pour le présent ,C'est ce qui s'est passé. Go modules.
Go ModulesUtilisation de base
Après une première compréhension Go modules La vie avant, cette vie après ,Nous sommes officiellement entrés Go modules Utilisation de, D'abord, on va créer un Go modules Projets pour( En principe, les répertoires créés ne doivent pas être placés dans GOPATH Au milieu.).
Commandes fournies
In Go modules Moyenne, Nous pouvons utiliser les commandes suivantes :
| Les ordres | Action |
|---|---|
| go mod init | Générer go.mod Documentation |
| go mod download | Télécharger go.mod Toutes les dépendances indiquées dans le fichier |
| go mod tidy | Organiser les dépendances existantes |
| go mod graph | Voir les structures de dépendance existantes |
| go mod edit | Édition go.mod Documentation |
| go mod vendor | Exporter toutes les dépendances du projet vers vendorTable des matières |
| go mod verify | Vérifier si un module a été altéré |
| go mod why | Voir pourquoi vous devez vous fier à un module |
Variables d'environnement fournies
In Go modules Il existe les variables d'environnement communes suivantes ,On peut passer par go env Commandes pour la visualisation,Comme suit:
$ go env GO111MODULE="auto" GOPROXY="https://proxy.golang.org,direct" GONOPROXY="" GOSUMDB="sum.golang.org" GONOSUMDB="" GOPRIVATE="" ...
GO111MODULE
GoLa langue est disponible GO111MODULE Cette variable d'environnement est utilisée comme Go modules Commutateur, Il permet de définir les paramètres suivants :
- auto: Tant que le projet contient go.mod Activer le fichier si Go modules,En ce moment Go1.11 à Go1.14 Est toujours la valeur par défaut .
- on:Activer Go modules,Paramètres recommandés, Sera la valeur par défaut dans les futures versions .
- off:Désactiver Go modules, Réglage non recommandé .
GO111MODULE Une petite histoire de
Vous remarquerez peut - être GO111MODULE Ce nom est plus “Bizarre”,En fait Go Il y a souvent de telles variables périodiques dans la langue , GO111MODULE Ce nom représente GoLa langue 1.11 Version ajoutée,Pour Module Variable de.
Comme dans Go1.5 Quand la version, Une variable d'environnement système a également été publiée GO15VENDOREXPERIMENT, Il est utilisé pour ouvrir vendor Prise en charge du Répertoire , La valeur par défaut n'était pas non plus activée ,Simplement en tant que experimental. Il est ensuite Go1.6 Changez également la valeur par défaut pour activer la version , Et finalement, official,GO15VENDOREXPERIMENT Les variables du système sortent de la scène historique .
Et l'avenir GO111MODULE Cette variable d'environnement système est également confrontée à ce problème , La valeur par défaut est également ajustée à on(Une foisGo1.13 Pense à ça. on, Et a été fusionné PR, Mais finalement, pour diverses raisons auto),Et ensuite, GO111MODULE Le support de , Nous pensons qu'il devrait être Go2 Oui. GO111MODULE Enlevez - le., Parce que si vous enlevez directement GO111MODULE Appui, Il y aura des problèmes de compatibilité .
GOPROXY
Cette variable d'environnement est principalement utilisée pour définir Go Agent de module(Go module proxy), Il est utilisé pour faire Go Capable de se détacher de la tradition lors de la traction ultérieure de la version du module VCS Comment, Extraction rapide directement à travers le site miroir .
GOPROXY La valeur par défaut pour est:https://proxy.golang.org,direct,C'est un problème sérieux.,C'est proxy.golang.org Inaccessible au pays, Donc ça va bloquer votre premier pas , Donc vous devez ouvrir Go modules Quand, En même temps, installez Go Agent de module,Exécutez la commande suivante:
$ go env -w GOPROXY=https://goproxy.cn,direct
GOPROXY La valeur de est une virgule anglaise “,” Segmenté Go Liste des agents du module , Autoriser la configuration de plusieurs agents de module , Supposons que vous ne vouliez pas utiliser , Il peut également être réglé à “off” , Ça va interdire Go Utiliser tout Go Agent de module.
directQu'est - ce que c'est?
Et parmi les valeurs qui viennent d'être définies , Nous pouvons trouver que la liste des valeurs contient “direct” Identification,À quoi ça sert??
En fait, “direct” C'est un indicateur spécial ,Pour indication Go Retourner à l'adresse source de la version du module pour récupérer(Par exemple, GitHub Attendez.),Le scénario est le suivant:: Précédent dans la liste des valeurs Go Module proxy return 404 Ou 410 En cas d'erreur,Go Essayez automatiquement le suivant dans la liste ,Rencontre “direct” Retour à la source , C'est - à - dire retourner à l'adresse source pour récupérer ,Et rencontrer EOF Se termine et lance quelque chose comme “invalid version: unknown revision...” Erreur.
GOSUMDB
Sa valeur est Go checksum database, Pour tirer la version du module ( Qu'il soit tiré de la source ou passé Go module proxy Tirez!) Assurez - vous que les données de version du module extraites ne sont pas altérées , En cas d'incohérence , C'est - à - dire qu'il peut y avoir altération , Sera interrompu immédiatement .
GOSUMDBLa valeur par défaut pour est:sum.golang.org, Il est également inaccessible au pays. ,Mais GOSUMDB Peut être Go Agent de module (Voir détails:Proxying a Checksum Database).
Pour que nous puissions régler GOPROXY C'est réglé., Et le module proxy que nous avons mis en place précédemment goproxy.cn Pour soutenir les agents sum.golang.org, Donc cette question est en cours de mise en place GOPROXY Après, Tu n'as pas besoin de t'inquiéter trop .
Et si c'est vrai GOSUMDB La valeur de a des exigences personnalisées , Il supporte le format suivant :
- Format 1:
<SUMDB_NAME>+<PUBLIC_KEY>. - Format 2:
<SUMDB_NAME>+<PUBLIC_KEY> <SUMDB_URL>.
Il peut également être réglé à “off”,C'est - à - dire l'interdiction Go Vérifier la version du module lors des opérations suivantes .
GONOPROXY/GONOSUMDB/GOPRIVATE
Ces trois variables d'environnement sont utilisées dans le projet actuel qui repose sur des modules privés , Comme la propriété privée de votre entreprise git Entrepôt,Ou github Bibliothèque privée dans , Tout appartient au module privé , Tout doit être réglé , Sinon, le retrait échouera .
Plus précisément , C'est une dépendance. GOPROXY Désignation Go Module proxy or by GOSUMDB Désignation Go checksum database Un scénario où aucun module n'est accessible .
En général, il est recommandé de définir directement GOPRIVATE, Sa valeur sera GONOPROXY Et GONOSUMDB Par défaut pour, La meilleure position recommandée est donc d'utiliser directement GOPRIVATE.
Et leurs valeurs sont toutes des virgules anglaises “,” Préfixe de chemin de module fractionné , C'est - à - dire que plusieurs ,Par exemple:
$ go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote"
Après le réglage,Préfixe git.xxx.com Et github.com/eddycjy/mquote Tous les modules seront considérés comme privés .
Si vous ne voulez pas réinitialiser à chaque fois , On peut aussi utiliser des jokers ,Par exemple:
$ go env -w GOPRIVATE="*.example.com"
C'est comme ça que ça se passe. , Tous les chemins du module sont example.com Sous - domaine de(Par exemple:git.example.com) Ne passera pas Go module proxy Et Go checksum database, Il est important de noter que example.com En soi.
OuvertGo Modules
Pour l'instantGo modules N'est pas activé par défaut ,Donc,GoLa langue est disponibleGO111MODULE Cette variable d'environnement est utilisée comme Go modulesCommutateur, Il permet de définir les paramètres suivants :
- auto: Tant que le projet contient go.mod Activer le fichier si Go modules,En ce momentGo1.11àGo1.14 Est toujours la valeur par défaut .
- on:Activer Go modules,Paramètres recommandés, Sera la valeur par défaut dans les futures versions .
- off:Désactiver Go modules, Réglage non recommandé .
Si vous n'êtes pas sûr de votre valeur actuelle ,Peut être exécutégo envLes ordres,Voir les résultats:
$ go env GO111MODULE="off" ...
Si nécessaireGO111MODULE Changement de valeur pour ,Recommandation acceptéego envCommande pour définir:
$ go env -w GO111MODULE=on
Mais il est important de noter que si la variable d'environnement système correspondante a une valeur ( Réglage effectué ), Le message d'avertissement suivant apparaît :warning: go env -w GO111MODULE=... does not override conflicting OS environment variable.
Ou vous pouvez définir directement les variables d'environnement du système (Écrire correspondant.bash_profileLes documents sont également disponibles)Pour atteindre cet objectif:
$ export GO111MODULE=on
Initialiser le projet
À compléter Go modules Après l'ouverture de , Nous devons créer un exemple de projet pour la démonstration ,Exécutez la commande suivante:
$ mkdir -p $HOME/eddycjy/module-repo $ cd $HOME/eddycjy/module-repo
Et ensuiteGo modulesInitialisation de,Comme suit:
$ go mod init github.com/eddycjy/module-repo go: creating new go.mod: module github.com/eddycjy/module-repo
En cours go mod init Au moment de l'ordre, Nous avons spécifié le chemin d'importation du module comme github.com/eddycjy/module-repo. Ensuite, nous créons sous la racine du projet main.go Documentation,Comme suit:
package main
import (
"fmt"
"github.com/eddycjy/mquote"
)
func main() {
fmt.Println(mquote.GetHello())
} Puis exécutez dans le Répertoire racine du projet go get github.com/eddycjy/mquote Les ordres,Comme suit:
$ go get github.com/eddycjy/mquote go: finding github.com/eddycjy/mquote latest go: downloading github.com/eddycjy/mquote v0.0.0-20200220041913-e066a990ce6f go: extracting github.com/eddycjy/mquote v0.0.0-20200220041913-e066a990ce6f
Voirgo.mod Documentation
Lors de l'initialisation du projet ,Génère un go.mod Documentation,Oui, c'est activé. Go modules Identification la plus importante requise pour le projet ,En même temps,GO111MODULE La valeur est: auto Identification de l'heure , Il décrit le projet actuel ( C'est - à - dire le module actuel )Méta - information pour, Chaque ligne commence par un verbe .
Après l'initialisation et le simple retrait ,Encore une foisgo.modDocumentation,Le contenu de base est le suivant::
module github.com/eddycjy/module-repo
go 1.13
require (
github.com/eddycjy/mquote v0.0.0-20200220041913-e066a990ce6f
)Pour plus d'explications , Nous avons simulé les citations suivantes :
module github.com/eddycjy/module-repo
go 1.13
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect
example.com/strawberry // incompatible
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/fried v0.1.0
replace example.com/banana => example.com/fish- module: Chemin du module utilisé pour définir le projet actuel .
- go: Utilisé pour identifier le module actuel Go Version linguistique, La valeur est la version au moment de l'initialisation du module , Pour l'instant, c'est juste un signe .
- require: Pour définir une version de module spécifique .
- exclude: Pour exclure une version de module spécifique de l'utilisation .
- replace: Utilisé pour remplacer une version de module par une autre .
Et vous verrez example.com/pear Il y en aura un derrière. indirect Identification,indirect L'identification indique que le module est une dépendance indirecte , C'est - à - dire dans l'application actuelle import Dans la Déclaration, Aucune référence explicite à ce module n'a été trouvée , C'est peut - être toi qui as commencé manuellement go get C'est tiré., Il est également possible que le module sur lequel vous comptez dépend , Il y en a plusieurs. .
Voirgo.sumDocumentation
Après le premier retrait des dépendances du module ,Il y en a un de plus go.sum Documentation, Il détaille toutes les versions de modules dont dépend directement ou indirectement le projet actuel , Et a écrit ces versions modulaires SHA-256 Valeur de hachage au cas où Go Pour les opérations futures, assurez - vous que les versions des modules dont dépend le projet ne sont pas altérées .
github.com/eddycjy/mquote v0.0.1 h1:4QHXKo7J8a6J/k8UA6CiHhswJQs0sm2foAQQUq8GFHM= github.com/eddycjy/mquote v0.0.1/go.mod h1:ZtlkDs7Mriynl7wsDQ4cU23okEtVYqHwl7F1eDh4qPg= github.com/eddycjy/mquote/module/tour v0.0.1 h1:cc+pgV0LnR8Fhou0zNHughT7IbSnLvfUZ+X3fvshrv8= github.com/eddycjy/mquote/module/tour v0.0.1/go.mod h1:8uL1FOiQJZ4/1hzqQ5mv4Sm7nJcwYu41F3nZmkiWx5I= ...
Nous pouvons voir qu'un chemin de module peut avoir les deux types suivants :
github.com/eddycjy/mquote v0.0.1 h1:4QHXKo7J8a6J/k8UA6CiHhswJQs0sm2foAQQUq8GFHM= github.com/eddycjy/mquote v0.0.1/go.mod h1:ZtlkDs7Mriynl7wsDQ4cU23okEtVYqHwl7F1eDh4qPg=
h1 hash - Oui. Go modules Version du module cible zip Après l'ouverture du dossier , Pour tous les fichiers du paquet à tour de rôle hash, Et ensuite les mettre hash Les résultats sont présentés sous une forme et un algorithmes fixes. hash Valeur.
Et h1 hash Et go.mod hash Les deux, Ou peut - être qu'il existe en même temps , Ou il n'existe que go.mod hash. Dans quelles circonstances n'existerait - il pas h1 hash Et alors?,C'est quand? Go Omettre une version de module lorsqu'on pense qu'elle n'est certainement pas disponible h1 hash, Il n'existe pas h1 hash,Existe seulement go.mod hash Situation.
Voir le cache global
Ce que nous venons de faire github.com/eddycjy/mquote Module retiré , Les résultats qu'il tire sont mis en cache dans $GOPATH/pkg/modEt $GOPATH/pkg/sumdb Sous la table des matières,Etmod La Table des matières sera github.com/foo/bar Format pour le stockage ,Comme suit:
mod ├── cache ├── github.com ├── golang.org ├── google.golang.org ├── gopkg.in ...
Notez que les données d'une même version de module ne sont mises en cache qu'une seule fois , Tous les autres modules sont partagés . Si vous souhaitez nettoyer toutes les données de version de module mises en cache ,Peut être exécuté go clean -modcache Les ordres.
Go ModulesEn basgo getComportement
Lors du retrait des dépendances du projet , Vous verrez que le processus de retrait est divisé en trois étapes ,Respectivement. finding(Découverte)、downloading(Télécharger)Et extracting(Extraction), Et il y a trois paragraphes sur l'extraction de l'information :

Il est important de noter que, La version tirée commit L'heure est UTC Le fuseau horaire prévaudra , Au lieu du fuseau horaire local , En attendant, on va découvrir que go get La version que la commande tire est v0.0.0, C'est parce que nous sommes directement exécutables go get -u Acquis, Aucune information de version spécifiée ,Par Go modules Choisissez vous - même selon les règles internes .
go get L'acte de retrait de
On vient d'utiliser go get La commande tire une nouvelle dépendance ,Alors go get Quelles autres fonctions sont offertes , Les commandes de retrait couramment utilisées sont les suivantes :
| Les ordres | Action |
|---|---|
| go get | Tirer les dépendances , Le retrait spécifié est effectué (Mise à jour), Aucun autre module dépendant ne sera mis à jour . |
| go get -u | Mettre à jour les dépendances existantes , Force à mettre à jour tous les autres modules dont il dépend ,Ne pas inclure soi - même. |
| go get -u -t ./... | Mise à jour des versions des modules pour toutes les dépendances directes et indirectes , Y compris ceux utilisés dans les essais unitaires . |
Alors je veux choisir comment la version spécifique devrait être exécutée ,Comme suit:
| Les ordres | Action |
|---|---|
| go get golang.org/x/[email protected] | Extraire la dernière version ,S'il existetag,Est préférable. |
| go get golang.org/x/[email protected] | Tirez! master Dernière branche commit. |
| go get golang.org/x/[email protected] | Tirez! tag Pour v0.3.2 De commit. |
| go get golang.org/x/[email protected] | Tirez! hash Pour 342b231 De commit, Sera finalement converti en v0.3.2. |
go getSélection de la version pour
Regardons en arrière ce qu'on a tiré go get github.com/eddycjy/mquote,Le résultat est v0.0.0-20200220041913-e066a990ce6f, Par rapport à ce qui précède go get Du point de vue du comportement, Vous pourriez encore avoir des doutes ,C'est là que ça s'est passé. go get Sans aucune version spécifiée , Quelles sont ses règles de sélection de version ,C'est pour ça que go get C'est v0.0.0, Quand va - t - il tirer le numéro de version normal tags Et alors?. En fait, il faut distinguer deux situations ,Comme suit:
Le module extrait a été publié tags:
- S'il n'y a qu'un seul module , Prenez le plus grand numéro de version tag.
- S'il y a plus d'un module, Calculer le chemin du module correspondant , Prenez le plus grand numéro de version principal tag(Sous - moduletag Le chemin du module pour aura une exigence de préfixe )
Le module extrait n'a pas été publié tags:
- Par défaut, la branche principale est la dernière commit De commithash.
Non publié tags
Alors pourquoi est - ce que v0.0.0 Et alors?,Parce que github.com/eddycjy/mquote Aucune publication tag,Comme suit:

Il est donc par défaut à la dernière branche primaire commit De commit Temps et commithash,C'est - à - dire 20200220041913-e066a990ce6f, Dans le deuxième cas .
Oui. tags
Publié dans le projet tags Dans le cas de, Il existe plusieurs modes , C'est - à - dire qu'il n'y a qu'un seul module et plusieurs modules , Nous présentons uniformément plusieurs modules , Parce que l'utilisation d'un seul module est déjà incluse dans le cas de plusieurs modules ,Comme le montre la figure ci - dessous::

Dans ce projet, On en a eu deux. tag,Respectivement.:v0.0.1 Et module/tour/v0.0.1. Vous pourriez vous demander ,Pourquoi? module/tour/v0.0.1 Alors“Bizarre.”Detag, Est - ce que ça veut dire quelque chose? ?
En fait, oui. Go modules Pour plusieurs modules dans le même projet tagMode de présentation, Sa structure de répertoire principale est :
mquote ├── go.mod ├── module │ └── tour │ ├── go.mod │ └── tour.go └── quote.go
Comme vous pouvez le voir dans mquote Le répertoire racine de ce projet a un go.mod Documentation,Et module/tour Il y en a un dans le catalogue. go.mod Documentation, La correspondance entre l'importation du module et les informations de version est la suivante :
| tag | Chemin d'importation du module | Sens |
|---|---|---|
| v0.0.1 | github.com/eddycjy/mquote | mquote Projetv 0.0.1 Version |
| module/tour/v0.01 | github.com/eddycjy/mquote/module/tour | mquote Sous - modules du projet module/tour De v0.0.1 Version |
Importer des modules principaux et des sous - modules
En combinaison avec ce qui précède, Si vous tirez sur le module principal , Toujours exécuter les commandes suivantes comme d'habitude :
$ go get github.com/eddycjy/[email protected] go: finding github.com/eddycjy/mquote v0.0.1 go: downloading github.com/eddycjy/mquote v0.0.1 go: extracting github.com/eddycjy/mquote v0.0.1
Si vous voulez tirer sur un sous - module ,Exécutez la commande suivante:
$ go get github.com/eddycjy/mquote/module/[email protected] go: finding github.com/eddycjy/mquote/module v0.0.1 go: finding github.com/eddycjy/mquote/module/tour v0.0.1 go: downloading github.com/eddycjy/mquote/module/tour v0.0.1 go: extracting github.com/eddycjy/mquote/module/tour v0.0.1
Nous comparons le retrait du module principal et du sous - module , Vous constaterez que le retrait du sous - module est un pas de plus , Il découvrira d'abord github.com/eddycjy/mquote/module, Continuez à extrapoler , Enfin, tirez sur module/tour.
Go Modules Description du chemin d'importation pour
Différentes versions du chemin d'importation
Dans le module précédent pull and Reference , Vous verrez que notre chemin d'importation de modules est github.com/eddycjy/mquote Et github.com/eddycjy/mquote/module/tour, Il n'y a rien de spécial .
En fait, non.,En fait, Go modules Dans la version principale v0 Et v1 Le numéro de version est omis dans le cas de , Et dans la version principale v2 Et au - dessus, le numéro de version principal doit être clairement indiqué. ,Sinon, il y aura conflit,Letag La correspondance approximative avec le chemin d'importation du module est la suivante :
| tag | Chemin d'importation du module |
|---|---|
| v0.0.0 | github.com/eddycjy/mquote |
| v1.0.0 | github.com/eddycjy/mquote |
| v2.0.0 | github.com/eddycjy/mquote/v2 |
| v3.0.0 | github.com/eddycjy/mquote/v3 |
En termes simples,, C'est que le numéro de version principal est v0 Et v1 Heure, Il n'est pas nécessaire d'inclure des informations sur la version principale dans le chemin d'importation du module ,Et v1 Après la version,C'est - à - dire v2 Lève - toi., Le numéro de version principal doit être ajouté à la fin du chemin d'importation du module , La référence doit être ajustée au format suivant :
import (
"github.com/eddycjy/mquote/v2/example"
)Ignorer également le numéro de version principal v0 Et v1 Obligatoire(Pas facultatif), Il n'y a donc qu'un seul chemin d'importation clair et normalisé pour chaque paquet .
Pourquoi ignorerv0Etv1Numéro de version principal de
- Ignoré dans le chemin d'importation v1 La raison de la version est : Considérant que de nombreux développeurs créent v1 La version ne change jamais le paquet , C'est officiellement encouragé , Je ne pense pas que tous ces développeurs publient involontairement v2 La version devrait être forcée d'avoir v1 Suffixe de version ,Cela va conduire à v1 La version devient“Bruit”Et inutile..
- Ignoré dans le chemin d'importation v0 La raison de la version est : Selon la spécification de version sémantique ,v0 Ces versions n'ont aucune garantie de compatibilité . Nécessite un v0 L'identification de la version n'aide pas beaucoup à assurer la compatibilité .
Go Modules Contrôle de version sémantique pour
On continue à Go Modules Le numéro de version est mentionné dans l'utilisation de , En fait, il s'appelle “Version sémantique”, Supposons que notre numéro de version soit v1.2.3,Comme suit:

Le format de version est “Numéro de version principal.Numéro de version secondaire.Numéro de révision”,La règle d'incrémentation du numéro de version est la suivante:
- Numéro de version principal:Quand vous avez fait quelque chose d'incompatible API Modifier.
- Numéro de version secondaire:Quand vous avez fait des ajouts fonctionnels compatibles vers le bas.
- Numéro de révision:Quand vous avez corrigé le problème de compatibilité descendante.
Supposons que vous soyez le numéro de version précédent ou un cas particulier , Vous pouvez ajouter des informations de version à “Numéro de version principal.Numéro de version secondaire.Numéro de révision”Derrière.,Comme extension,Comme suit:

Jusqu'à présent, nous avons présenté Go modules Deux types de numéros de version pris en charge , Avant de publier une nouvelle version tag Quand, Attention à suivre , Sinon, les numéros de version qui ne suivent pas les règles de version sémantique ne peuvent pas être tirés .
Go Modules Sélection de la version minimale pour
Maintenant nous avons un module , Il y a aussi des versions tag, Mais un module dépend souvent de beaucoup d'autres modules , Et il y a de fortes chances que différents modules soient dépendants d'une version différente du même module ,Comme le montre la figure ci - dessous:(DeRuss Cox):

Dans les dépendances ci - dessus ,Module A Dépend du module B Et modules C,Et les modules B Dépend du module D,Module C Dépend du module D Et F,Module D Encore une fois dépendant du module E, Et les différentes versions du même module dépendent également des différentes versions du module correspondant .Alors, à ce moment - là, Go modules Comment sélectionner la version , Quelle version a été choisie ?
Nous avons fondé proposal On sait que,Go modules Une liste des versions dépendantes de chaque module sera compilée , Et finalement obtenir une liste de construction ,Comme le montre la figure ci - dessous:(DeRuss Cox):

Nous avons vu rough list Et final list, La différence entre les deux est que les modules référencés à plusieurs reprises D(v1.3、v1.4), La liste finale a choisi le module D De v1.4 Version,Principales causes:
- Contrôle des versions sémantiques :Parce que le module D De v1.3 Et v1.4 Changement de version, Tous appartiennent à un changement de numéro de version , Et sous la contrainte de la version sémantique ,v1.4 Doit être compatible vers le bas v1.3 Version, Il n'y a donc pas eu de changement dommageable , C'est - à - dire compatible .
- Spécification du chemin d'importation du module : Le numéro de version principal est différent , Le chemin d'importation du module est différent , En cas d'incompatibilité , Son numéro de version principal change , Le chemin d'importation du module change naturellement , Il n'y a donc pas de conflit avec la base du premier point. .
go.sum Les documents doivent - ils être soumis?
En théorie go.mod Et go.sum Tous les documents doivent être soumis à votre Git Dans l'entrepôt..
Disons qu'on ne télécharge pas go.sum Documentation, Et ça fait que tout le monde exécute Go modules Commandes connexes, Une nouvelle copie sera produite go.sum, C'est - à - dire qu'il revient en amont pour tirer , Ça aurait pu être trafiqué. ,Il y a un grand danger pour la sécurité., Perte de la version de référence ( Le premier auteur , Version souhaitée ) Contenu de la vérification pour ,Donc, go.sum Les documents doivent être soumis .
边栏推荐
猜你喜欢

IPV4的未来替代品!一文读懂IPV6的优势特点和地址类型

After passing the hcip exam, I still failed to change my career. What do professional network workers value most

Redis cache

Asynchronous FIFO

Optimization - linear programming

Digital data depth | about software self-control, source code left, no code right

OJ每日一练——过滤多余的空格

MySQL master-slave synchronization and its basic process of database and table division

Freshman girls' nonsense programming is popular! Those who understand programming are tied with Q after reading

Oracle ASM使用asmcmd中的cp命令来执行远程复制
随机推荐
Asynchronous FIFO
Thead Safety心得体会
KunlunDB查询优化(二)Project和Filter下推
OJ每日一练——整理命名
OJ daily practice - spanning 2020
Problèmes rencontrés lors de l'utilisation de redistemplate
OJ daily practice - class dining
Array and string offset access syntax with curly braces is no longer support
Flutter outsourcing, undertaking flutter project
为 localStorage 添加过期时间
冒泡排序 指针
Customize multi-level list styles in word
KunlunDB备份和恢复
Redistemplate encountered problems with \x00
Synchronization circuit and cross clock domain circuit design 2 -- cross clock domain transmission (FIFO) of multi bit signals
Redis cache
Learning the interpretable representation of quantum entanglement, the depth generation model can be directly applied to other physical systems
Autoincrement attribute of sqlserver replication table
Uniapp modifies array properties, and the view is not updated
Various schemes for lazy loading of pictures