2015-06-03 10 views
31

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?

risposta

45

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?

+1

sembra strano che andare installare non aggiorna l'eseguibile se è identico a quello precedentemente installato ... eventuali approfondimenti qui? –

4

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 e go install costruire

Ogni 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 di myprog, nonché myprog stesso, ma verrà installato solo myprog.(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 uno myprog creato senza ottimizzazioni del compilatore, ma non viene più reinstallato anche gli usi myprog dei pacchetti dalla libreria standard senza ottimizzazioni del compilatore.