Réponses:
Ce que fait la go
commande dépend de si nous l'exécutons pour un package "normal" ou pour le "main"
package spécial .
Pour les packages
go build
crée votre package puis rejette les résultats .go install
builds installe ensuite le package 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
.go build
?Vous pouvez transmettre des packages aux go build
packages que vous souhaitez construire. Vous pouvez également transmettre une liste de .go
fichiers à partir d'un seul répertoire, qui est ensuite traitée comme la liste des fichiers source spécifiant un seul package.
Si aucun package (chemins d'importation) n'est fourni, la construction est appliquée sur le répertoire courant.
Un chemin d'importation peut contenir un ou plusieurs "..."
caractères génériques (auquel cas il s'agit d'un modèle ). ...
peut correspondre à n'importe quelle chaîne, par exemple net/...
correspond au net
package et les packages se trouvant dans l'un de ses sous-dossiers. La commande
go build ./...
souvent utilisé pour créer le package dans le dossier actuel et tous les packages récursifs. Cette commande émise dans une racine de projet crée le projet complet.
Pour en savoir plus sur la spécification des packages, exécutez go help packages
.
La prise en charge préliminaire des modules Go a été introduite dans Go 1.11, et les modules sont devenus par défaut à partir de Go 1.13. Lorsque l' go
outil est exécuté à partir d'un dossier contenant un go.mod
fichier (ou l'un des parents du dossier actuel), l' go
outil s'exécute en mode module-aware (le mode hérité est appelé mode GOPATH ).
En mode module-aware, GOPATH ne définit plus la signification des importations lors d'une construction, mais il stocke toujours les dépendances téléchargées (dans GOPATH / pkg / mod) et les commandes installées (dans GOPATH / bin, sauf si GOBIN est défini).
Lors de la construction de modules, ce qui est construit est spécifié par la liste de construction . La liste de construction ne contient initialement que le module principal (le module contenant le répertoire dans lequel la go
commande est exécutée), et les dépendances du module principal sont ajoutées à la liste de construction, de manière récursive (des dépendances de dépendances sont également ajoutées).
Pour plus d'informations, exécutez go help modules
.
Fondamentalement, vous pouvez utiliser go build
pour vérifier que les packages peuvent être construits (avec leurs dépendances) tout en go install
installant (définitivement) les résultats dans les dossiers appropriés de votre $GOPATH
.
go build
se terminera silencieusement si tout va bien et vous donnera des messages d'erreur si les paquets ne peuvent pas être compilés / compilés.
Chaque fois que l' go
outil installe un package ou un binaire, il installe également toutes les dépendances dont il dispose, donc l'exécution go install
installera également les packages dont dépend votre programme (packages "go gettable" disponibles publiquement), automatiquement.
Pour commencer, lisez la page officielle Comment écrire le code Go .
Plus d'informations sur l' go
outil: Command go
Vous pouvez également obtenir plus d'aide en exécutant la commande suivante:
go help build
Il est également intéressant de noter que démarrer avec 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 courant) réussit, supprimez l'exécutable écrit par 'go build', s'il est présent. Cela évite de laisser un binaire périmé derrière ...
Pour compléter la liste, go run
compile votre application dans un dossier temporaire et démarre ce binaire exécutable. Lorsque l'application se ferme, elle nettoie correctement les fichiers temporaires.
Question inspirée par Dave Cheney de What does go build build?
Pour le paquet:
go build
: construit votre package puis rejette les résultats
Ce ne sera plus le cas après Go 1.10 (Q1 2018), grâce aux CL 68116 et CL 75473 . Voir ce fil , que je référence ici.
Que construisent exactement les commandes
go build
etgo install
Chaque fois que l'outil go installe un package ou un binaire, il installe également toutes les dépendances dont il dispose, donc exécuter go install installera également les packages dont dépend votre programme (packages "go gettable" disponibles publiquement), automatiquement.
En fait ... go install
changera également avec Go 1.10, en plus du nouveau cache:
La
go install
commande " " n'installe plus les dépendances des packages nommés ( CL 75850 ).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
" installait également des dépendances.
L'installation implicite de dépendances pendant "go install
" a causé beaucoup de confusion et de maux de tête pour les utilisateurs, mais il était auparavant nécessaire d'activer les builds incrémentiels.
Plus maintenant.
Nous pensons que la nouvelleinstall what I said
sémantique " " 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 des 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
" utilisé pour installer des dépendances reconstruites a le plus souvent semé la confusion avec-a
, ce qui signifie "force rebuild of all dependencies
".
Maintenant, "go install -a myprog
" forcera une reconstruction complète de toutes les dépendances demyprog
, ainsi que demyprog
lui-même, mais seulementmyprog
sera installé. (Toutes les dépendances reconstruites seront toujours enregistrées dans le cache de compilation, bien sûr.)
Faire en sorte que ce cas fonctionne de manière plus compréhensible est particulièrement important en conjonction avec la nouvelle analyse d'obsolescence basée sur le contenu, car elle voit de bonnes raisons de reconstruire les dépendances plus souvent qu'auparavant. , ce qui aurait augmenté la quantité de confusion "pourquoi mes dépendances ont-elles été installées".
Par exemple, si vous exécutez "go install -gcflags=-N myprog
", cela installe unmyprog
construit sans optimisations du compilateur, mais il ne réinstalle plus également les packagesmyprog
utilisés à partir de la bibliothèque standard sans optimisations du compilateur.
go build
- ce que , est-ce que get
s? J'ai une erreur de construction cannot find package "github.com/spf13/cobra" in any of:…
. Je ne sais pas comment le dire pour l'obtenir. Dois-je obtenir explicitement?
go.mod
fichier?
go version go1.11.4 linux/amd64
. Je ne sais pas pour go.mod. Je suis en train de reconstruire https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, c'est étrange car je viens de construire le paquet entier, et j'utilise cet exemple comme base, et j'ai créé une version plus basique qui a fonctionné (mais n'utilise pas cette bibliothèque). Je ne vois pas comment il n'a pas été installé avec le package moustache.