Cosa fa build build?

I programmatori di New Go spesso non conoscono né confondono ciò che fa il comando go go fondamentale.

Cosa fanno esattamente i go build e go install go build build e dove inseriscono il risultato / output?

Il comando go dipende dal fatto che lo eseguiamo per un pacchetto “normale” o per lo speciale pacchetto "main" .

Per i pacchetti

  • go build crea il tuo pacco quindi scarta i risultati .
  • go install builds quindi installa il pacchetto nella tua $GOPATH/pkg .

Per i comandi (pacchetto main )

  • go build crea il comando e lascia il risultato nella directory di lavoro corrente .
  • go install genera il comando in una directory temporanea, quindi lo sposta in $GOPATH/bin .

Fondamentalmente puoi usare go build come verifica che i pacchetti possano essere compilati (insieme alle loro dipendenze) mentre go install anche (permanentemente) installa i risultati nelle cartelle appropriate del tuo $GOPATH .

go build terminerà silenziosamente se tutto è a posto e ti darà dei 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 tutte le dipendenze di cui dispone, quindi eseguendo go install installerà anche pacchetti il ​​cui programma dipende (pacchetti disponibili “go gettable”), automaticamente.

Per cominciare, leggi la pagina ufficiale Come scrivere codice .

Ulteriori informazioni sullo strumento go : comando vai

Puoi anche ottenere più aiuto eseguendo il seguente comando:

 go help build 

Vale anche la pena notare che a partire da Go 1.5 go install rimuove anche gli eseguibili creati da go build ( source ):

Se ‘go install’ (senza argomenti, ovvero la directory corrente) ha esito positivo, rimuovere l’eseguibile scritto da ‘go build’, se presente. Questo evita di lasciare un binario stantio dietro …

Per completare l’elenco, go run compilazione dell’applicazione in una cartella temporanea e avvia quel file eseguibile. Quando l’app esiste, pulisce correttamente i file temporanei.

Domanda ispirata da Dave Cheney’s What what go build build?

Per il pacchetto:

go build : crea il tuo pacchetto quindi elimina i risultati

Ciò non avverrà dopo Go 1.10 (Q1 2018), grazie a CL 68116 e CL 75473 . Vedi questo thread , che faccio riferimento qui.

Cosa fanno esattamente i go build e go install go build go install

Ogni volta che lo strumento go installa un pacchetto o un binario, installa anche tutte le dipendenze di cui dispone, quindi eseguendo go installa installerà anche pacchetti il ​​cui programma dipende (pacchetti disponibili “go gettable”), automaticamente.

In realtà … go install cambierà anche con Go 1.10, oltre alla nuova cache:

Il comando ” go installnon installa più le dipendenze dei pacchetti denominati ( 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 da loro.
Per forzare l’installazione delle dipendenze durante ” go install “, usa il nuovo ” go install -i , per analogia con ” go build -i ” e ” go test -i “.

Il fatto che ” go install ” usato per installare qualsiasi dipendenza ricostruita ha causato confusione il più delle volte in combinazione con -a , che significa ” force rebuild of all dependencies “.
Ora ” go install -a myproggo install -a myprog una ricostruzione completa di tutte le dipendenze di myprog , nonché della myprog stessa, ma solo myprog verrà installato. (Tutte le dipendenze ricostruite verranno comunque salvate nella cache di build, ovviamente).
Far funzionare questo caso in modo più comprensibile è particolarmente importante in concomitanza con la nuova analisi di staleness basata sul contenuto, perché vede buone ragioni per ribuild le dipendenze più spesso di prima, il che avrebbe aumentato la confusione di “perché le mie dipendenze sono state installate”.
Ad esempio, se si esegue ” go install -gcflags=-N myprog “, viene installato un myprog creato senza ottimizzazioni del compilatore, ma non viene più reinstallato anche i pacchetti che myprog utilizza dalla libreria standard senza ottimizzazioni del compilatore.