当前位置:网站首页>[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 :

  1. Go Depuis longtemps, la langue dépend de la gestion des problèmes .
  2. “Élimination”Existant GOPATH Mode d'utilisation de.
  3. 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 coursgo 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.
  • 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 ordresAction
go mod initGénérer go.mod Documentation
go mod downloadTélécharger go.mod Toutes les dépendances indiquées dans le fichier
go mod tidyOrganiser les dépendances existantes
go mod graphVoir 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 whyVoir 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 ordresAction
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 ordresAction
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:

  1. 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 )
  2. 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 :

tagChemin d'importation du moduleSens
v0.0.1github.com/eddycjy/mquotemquote Projetv 0.0.1 Version
module/tour/v0.01github.com/eddycjy/mquote/module/tourmquote 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 :

tagChemin d'importation du module
v0.0.0github.com/eddycjy/mquote
v1.0.0github.com/eddycjy/mquote
v2.0.0github.com/eddycjy/mquote/v2
v3.0.0github.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

  1. 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..
  2. 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:

  1. Numéro de version principal:Quand vous avez fait quelque chose d'incompatible API Modifier.
  2. Numéro de version secondaire:Quand vous avez fait des ajouts fonctionnels compatibles vers le bas.
  3. 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:

  1. 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 .
  2. 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 .

原网站

版权声明
本文为[Weixin 43224306]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/173/202206222124162708.html