web-dev-qa-db-fra.com

Qu'est-ce que va construire construire?

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?

75
icza

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?

92
icza

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 Et go 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 est foo.

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 de myprog, ainsi que de myprog lui-même, mais uniquement de myprog. 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 un myprog construit sans optimisations du compilateur, mais il ne réinstalle plus les packages utilisés par myprog de la bibliothèque standard sans optimisations du compilateur.

13
VonC