
Go 1.12, prévu pour février 2019, affinera le support du module mais le laissera toujours en mode automatique par défaut. Outre de nombreuses corrections de bogues et autres améliorations mineures, le changement le plus important dans Go 1.12 est que des commandes telles que go run x.go ou go get rsc.io/2fa@v1.1.0 peuvent désormais fonctionner en mode GO111MODULE = on sans fichier go.mod explicite.

L’équipe rappelle que depuis huit ans qu’elle a lancé GOPATH, un nombre incroyable d’outils a été créé, qui suppose que le code source de Go est stocké dans GOPATH. Le passage aux modules nécessite donc la mise à jour de tout le code qui en découle. C’est pour cela qu’elle a conçu un nouveau paquetage, golang.org/x/tools/go/packages, qui résume l’opération de recherche et de chargement d’informations sur le code source Go d’une cible donnée. Ce nouveau paquet s'adapte automatiquement au mode modules et à GOPATH et est également extensible aux dispositions de code spécifiques aux outils, telles que celle utilisée par Bazel. L’équipe a travaillé de concert avec des auteurs d’outils de toute la communauté Go pour les aider à adopter golang.org/x/tools/go/packages dans leurs outils.

Index du module
Une des parties les plus importantes de la conception initiale de go get était sa décentralisation : Google pensait alors (et l'équipe affirme encore y croire) que quiconque devrait pouvoir publier son code sur n'importe quel serveur, contrairement aux registres centraux tels que Perl. CPAN, Maven de Java ou Node NPM. En plaçant les noms de domaine au début de l'opération, l'espace d'importation a été réutilisé dans un système décentralisé existant et vous évitait de devoir résoudre à nouveau les problèmes de choix des utilisateurs. Cela permettait également aux entreprises d'importer du code sur des serveurs privés, parallèlement à du code provenant de serveurs publics. Il est essentiel de préserver cette décentralisation lorsque nous passons aux modules Go.
La décentralisation des dépendances de Go a eu de nombreux avantages, mais elle a également présenté quelques inconvénients importants. La première est qu’il est trop difficile de trouver tous les packages Go disponibles au public. Chaque site qui souhaite fournir des informations sur les packages doit effectuer sa propre analyse ou attendre que l'utilisateur lui pose des questions sur un package en particulier avant de le récupérer.
Aussi, l'équipe travaille sur un nouveau service : l'index de module Go, qui fournira un journal public des paquets entrant dans l'écosystème Go. Des sites tels que godoc.org et goreportcard.com pourront consulter ce journal pour rechercher de nouvelles entrées au lieu d'avoir à chaque fois du code implémenté indépendamment pour trouver de nouveaux packages. Google veut également que le service permette de rechercher des paquets à l’aide de requêtes simples, afin de permettre à goimports d’ajouter des importations pour les paquets qui n’ont pas encore été téléchargés sur le système local.
Authentification du module
Aujourd'hui, go get s'appuie sur une authentification au niveau de la connexion (HTTPS ou SSH) pour vérifier que le logiciel est en communication avec le bon serveur. Il n'y a pas de vérification supplémentaire du code lui-même, ce qui laisse ouverte la possibilité d'attaques par interférence si les mécanismes HTTPS ou SSH sont compromis d'une manière ou d'une autre. La décentralisation signifie que le code d'une build est extrait de nombreux serveurs différents, ce qui signifie que la build dépend de nombreux systèmes pour fournir le code correct.
La conception des modules Go améliore l'authentification du code en stockant un fichier go.sum dans chaque module ; ce fichier répertorie le hachage cryptographique de l’arborescence de fichiers attendue pour chacune des dépendances du module. Lorsque vous utilisez des modules, la commande go utilise go.sum pour vérifier que les dépendances sont identiques, octet par octet, aux versions attendues avant de les utiliser dans une build. Mais le fichier go.sum ne répertorie que les hachages correspondant aux dépendances spécifiques utilisées par ce module. Si vous ajoutez une nouvelle dépendance ou mettez à jour des dépendances avec go get -u, il n'y a pas d'entrée correspondante dans go.sum et donc pas d'authentification directe des octets téléchargés.
Pour les modules accessibles au public, Google prévoit d'exécuter un service appelé notaire, qui suit le journal d'index des modules, télécharge de nouveaux modules et signe de manière cryptographique les instructions de la forme « le module M de la version V contient un hachage H de l'arborescence de fichiers ». puis publie tous ces hachages répertoriés dans un journal inviolable de type certificat transparent de type interrogeable, de sorte que tout le monde puisse vérifier que le notaire se comporte correctement. Ce journal servira de fichier go.sum public et global que go get pourra utiliser pour authentifier les modules lors de l’ajout ou de la mise à jour de dépendances.

Miroirs de modules
Parce que le système décentralisé va chercher le code de plusieurs serveurs d'origine, le code de récupération est aussi rapide et fiable que le serveur le plus lent et le moins fiable. La seule défense disponible avant les modules concernait les dépendances des fournisseurs dans vos propres référentiels. Bien que ce système va continuer à être prise en charge, Google préfère une solution qui fonctionne pour tous les modules (pas seulement ceux que vous utilisez déjà) et qui ne nécessite pas de...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.