I programmatori New Go spesso non sanno o non si confondono con ciò che fa il comando go go fondamentale.Che cosa significa costruire?
Che cosa fanno esattamente i comandi go build
e go install
e dove inseriscono il risultato/l'output?
I programmatori New Go spesso non sanno o non si confondono con ciò che fa il comando go go fondamentale.Che cosa significa costruire?
Che cosa fanno esattamente i comandi go build
e go install
e dove inseriscono il risultato/l'output?
Il comando go
dipende dal fatto che lo eseguiamo per un pacchetto "normale" o per il pacchetto speciale "main"
.
Per i pacchetti
go build
costruisce il pacchetto poi scarti i risultati.go install
builds installa il pacchetto nella directory $GOPATH/pkg
.Per i comandi (pacchetto main
)
go build
costruisce il comando e lascia il risultato nella directory corrente di lavoro.go install
crea il comando in una directory temporanea, quindi lo sposta in $GOPATH/bin
.Fondamentalmente si può utilizzare go build
come verifica che i pacchetti possono essere costruite (insieme alle loro dipendenze), mentre go install
anche (in modo permanente) installa i risultati nelle appropriate cartelle del vostro $GOPATH
.
go build
terminerà automaticamente se tutto è a posto, e fornirà messaggi di errore se i pacchetti non possono essere compilati/compilati.
Ogni volta che lo strumento go
installa un pacchetto o un binario, installa anche qualsiasi dipendenza che ha, quindi l'esecuzione di go install
installerà anche pacchetti il cui programma dipende (pacchetti disponibili "go gettable"), automaticamente.
Per iniziare, leggere la pagina ufficiale How to Write Go Code.
Maggiori informazioni sulla go
strumento: Command go
È inoltre possibile ottenere più aiuto eseguendo il comando seguente:
go help build
E 'anche interessante notare che a partire da Go 1.5 go install
rimuove anche i file eseguibili creati per go build
(source):
Se 'go install' (senza argomenti, mean ing la directory corrente) riesce, rimuovere l'eseguibile scritto da 'go build', se presente. Questo evita di lasciare un binario stantio dietro ...
Per completare l'elenco, go run
compila l'applicazione in una cartella temporanea e avvia quel file eseguibile. Quando l'app esiste, pulisce correttamente i file temporanei.
domanda ispirata da Dave Cheney di What does go build build?
Per il pacchetto:
go build
: costruisce il pacchetto poi scarti i risultati
che non sarà vero dopo Go 1,10 (Q1 2018), grazie a CL 68116 e CL 75473. Vedi this thread, che faccio riferimento qui.
Che cosa esattamente i comandi
go build
ego install
costruireOgni volta che lo strumento go installa un pacchetto o binario, si installa anche qualunque dipendenze che ha, così in esecuzione go installare anche installare i pacchetti vostra il programma dipende (pacchetti disponibili "go gettable"), automaticamente.
In realtà ... go install
cambierà anche con Go 1.10, oltre della nuova cache:
Il "
go install
" comando non installa più dipendenze dei pacchetti di nome (CL 75850).Se si esegue "
go install foo
", l'unica cosa installata èfoo
.Prima, variava. Se le dipendenze non erano aggiornate, "
go install
" installava anche eventuali dipendenze.
L'installazione implicita delle dipendenze durante "go install
" ha causato molta confusione e mal di testa per gli utenti, ma in precedenza era necessario abilitare build incrementali.
Non più.
Pensiamo che la nuova semantica "install what I said
" sarà molto più comprensibile, soprattutto perché è chiaro dalle segnalazioni di bug che molti utenti già si aspettavano.
per forzare l'installazione delle dipendenze durante la "go install
", utilizzare la nuova "go install -i
", per analogia con "go build -i
" e "go test -i
".Il fatto che "
go install
" utilizzato per installare le dipendenze ricostruite causato confusione più spesso in combinazione con-a
, che significa "force rebuild of all dependencies
".
Ora "go install -a myprog
" imporrà una ricostruzione completa di tutte le dipendenze dimyprog
, nonchémyprog
stesso, ma verrà installato solomyprog
.(Tutte le dipendenze ricostruite verranno comunque salvate nella cache di build, ovviamente.)
Rendere questo caso più comprensibile è particolarmente importante in concomitanza con la nuova analisi della staleness basata sul contenuto, perché vede buone ragioni per ricostruire le dipendenze più spesso di prima, il che avrebbe aumentato la confusione di "perché le mie dipendenze si sono installate".
Ad esempio, se si esegue "go install -gcflags=-N myprog
", viene installato unomyprog
creato senza ottimizzazioni del compilatore, ma non viene più reinstallato anche gli usimyprog
dei pacchetti dalla libreria standard senza ottimizzazioni del compilatore.
sembra strano che andare installare non aggiorna l'eseguibile se è identico a quello precedentemente installato ... eventuali approfondimenti qui? –