Les nouveaux programmeurs de Go ne savent souvent pas ou ne comprennent pas ce que fait la commande fondamentale go build.
Qu'est-ce que le go build
et go install
Les commandes sont construites et où placent-elles le résultat/la sortie?
La commande go
dépend de la manière dont elle est exécutée pour un package "normal" ou pour la commande spéciale "main"
paquet.
Pour les packages
go build
construit votre paquet puis ignore les résultats.go install
construit alors installe le paquet dans votre $GOPATH/pkg
répertoire. Pour les commandes (package main
)
go build
_ construit la commande et laisse le résultat dans le répertoire de travail actuel.go install
construit la commande dans un répertoire temporaire puis la déplace vers $GOPATH/bin
.Fondamentalement, vous pouvez utiliser go build
pour vérifier que les paquets peuvent être construits (avec leurs dépendances) tandis que go install
installe également (définitivement) les résultats dans les dossiers appropriés de votre $GOPATH
.
go build
se terminera silencieusement si tout va bien, et vous enverra des messages d'erreur si les paquetages ne peuvent pas être construits/compilés.
Chaque fois que l'outil go
installe un paquet ou un binaire, il installe également ses dépendances, exécutant ainsi go install
installera également les paquets dont dépend votre programme (paquets à la disposition du public, "accessibles"), automatiquement.
Pour commencer, lisez la page officielle Comment écrire un code Go .
Plus d'informations sur l'outil go
: Command go
Vous pouvez également obtenir plus d'aide en exécutant la commande suivante:
go help build
Il convient également de noter que, à partir de Go 1.5 go install
supprime également les exécutables créés par go build
_ ( source ):
Si 'go install' (sans argument, c'est-à-dire le répertoire en cours) réussit, supprimez l'exécutable écrit par 'go build', s'il est présent. Cela évite de laisser un binaire obsolète derrière ...
Pour compléter la liste, go run
compile votre application dans un dossier temporaire et lance le binaire exécutable. Lorsque l'application se ferme, elle nettoie correctement les fichiers temporaires.
Question inspirée par Dave Cheney Qu'est-ce qui va construire construire?
Pour le paquet:
go build
: Construit votre paquet alors élimine les résultats
Ce ne sera plus le cas après Go 1.10 (T1 2018), grâce à CL 68116 et CL 7547 . Voir ce fil , que je référence ici.
Que font exactement les commandes
go build
Etgo install
Chaque fois que l'outil go installe un paquet ou un binaire, il installe également toutes les dépendances dont il dispose, de sorte que lancer l'installation installe également les paquets dont dépend votre programme (disponibles publiquement, paquets "aller de l'avant"), automatiquement.
En fait ... go install
Changera aussi avec Go 1.10, en plus du nouveau cache:
La commande "
go install
" n’installe plus les dépendances des packages nommés ( CL 7585 ).Si vous exécutez "
go install foo
", La seule chose installée estfoo
.Avant, ça variait. Si les dépendances étaient obsolètes, "
go install
" A également installé toutes les dépendances.
L'installation implicite de dépendances au cours de "go install
" A créé beaucoup de confusion et de maux de tête pour les utilisateurs, mais il était auparavant nécessaire d'activer les versions incrémentielles.
Plus maintenant.
Nous pensons que la nouvelle sémantique "install what I said
" Sera beaucoup plus compréhensible, d’autant plus qu’il ressort clairement des rapports de bogues que de nombreux utilisateurs les attendaient déjà.
Pour forcer l'installation de dépendances pendant "go install
", Utilisez le nouveau "go install -i
" , par analogie avec "go build -i
"Et"go test -i
".Le fait que "
go install
" Installait toutes les dépendances reconstruites était source de confusion le plus souvent avec-a
, Ce qui signifie "force rebuild of all dependencies
".
Maintenant, "go install -a myprog
" Imposera une reconstruction complète de toutes les dépendances demyprog
, ainsi que demyprog
lui-même, mais uniquement demyprog
. va s'installer. (Toutes les dépendances reconstruites seront toujours enregistrées dans le cache de construction, bien sûr.)
Il est particulièrement important, parallèlement à la nouvelle analyse de staleness basée sur le contenu, de rendre cette affaire plus compréhensible, car elle a de bonnes raisons de reconstruire des dépendances plus souvent qu'auparavant, ce qui aurait augmenté la quantité de "pourquoi mes dépendances être installé "confusion.
Par exemple, si vous exécutez "go install -gcflags=-N myprog
", Vous installez unmyprog
construit sans optimisations du compilateur, mais il ne réinstalle plus les packages utilisés parmyprog
de la bibliothèque standard sans optimisations du compilateur.