Nieuwe Go-programmeurs weten vaak niet of raken in de war wat het fundamentele go build-commando doet.
Wat bouwen de go build
en go install
commando’s precies en waar zetten ze het resultaat/de uitvoer?
Antwoord 1, autoriteit 100%
Wat het go
commando doet, hangt af van of we het uitvoeren voor een “normaal” pakket of voor het speciale "main"
pakket.
Voor pakketten
go build
bouwt uw pakket en gooit de resultaten weg.go install
bouwt en installeerthet pakket in uw$GOPATH/pkg
directory.
Voor opdrachten (pakket main
)
go build
bouwt de opdracht en laat het resultaat in de huidige werkdirectory.go install
bouwt het commando in een tijdelijke map en verplaatst het vervolgens naar$GOPATH/bin
.
Wat moet je doorgeven aan go build
?
Je mag pakkettendoorgeven aan go build
, pakketten die je wilt bouwen. U kunt ook een lijst met .go
-bestanden uit een enkele map doorgeven, die vervolgens wordt behandeld als de lijst met bronbestanden die een enkel pakket specificeren.
Als er geen pakketten (importpaden) zijn opgegeven, wordt de build toegepast op de huidige map.
Een importpad kan een of meer "..."
-jokertekens bevatten (in dat geval is het een patroon). ...
kan overeenkomen met elke tekenreeks, b.v. net/...
komt overeen met het pakket net
en de pakketten die zich in een van zijn submappen bevinden. Het commando
go build ./...
vaak gebruikt om het pakket in de huidige map te bouwen en alle pakketten komen terug. Deze opdracht die in een projectroot wordt gegeven, bouwt het volledige project op.
Voor meer informatie over het specificeren van pakketten, voer go help packages
uit.
Over modules
Voorlopige ondersteuning voor Go-modules werd geïntroduceerd in Go 1.11 en modules werden standaard vanaf Go 1.13. Wanneer de tool go
wordt uitgevoerd vanuit een map die een go.mod
-bestand bevat (of een van de bovenliggende elementen van de huidige map), wordt de go
tool draait in module-awaremodus (de legacy-modus wordt GOPATH-modusgenoemd).
In modulebewuste modus definieert GOPATH niet langer de betekenis van import
tijdens een build, maar het slaat nog steeds gedownloade afhankelijkheden op (in GOPATH/pkg/mod)
en geïnstalleerde commando’s (in GOPATH/bin, tenzij GOBIN is ingesteld).
Bij het bouwen van modules wordt gespecificeerd wat er gebouwd wordt door de buildlijst. De buildlijst bevat in eerste instantie alleen de hoofdmodule (de module die de map bevat waarin de opdracht go
wordt uitgevoerd), en de afhankelijkheden van de hoofdmodule worden recursief aan de bouwlijst toegevoegd (afhankelijkheden van afhankelijkheden zijn ook toegevoegd).
Voor meer informatie, voer go help modules
uit.
In principe kunt u go build
gebruiken om te controleren of de pakketten kunnen worden gebouwd (samen met hun afhankelijkheden), terwijl go install
ook (permanent) de resultaten installeert in de juiste mappen van uw $GOPATH
.
go build
wordt stilzwijgend beëindigd als alles in orde is en geeft foutmeldingen als de pakketten niet kunnen worden gebouwd/gecompileerd.
Telkens wanneer de go
-tool een pakket of binair bestand installeert, installeert het ook alle afhankelijkheden die het heeft, dus als u go install
uitvoert, worden ook pakketten geïnstalleerd waarvan uw programma afhankelijk is (openbaar beschikbaar , “go gettable” pakketten), automatisch.
Lees om te beginnen de officiële Go-code schrijvenpagina.
Meer informatie over de tool go
: Command go
Je kunt ook meer hulp krijgen door de volgende opdracht uit te voeren:
go help build
Het is ook vermeldenswaard dat vanaf Go 1.5 go install
ook de uitvoerbare bestanden worden verwijderd die zijn gemaakt door go build
(bron):
Indien ‘ga installeren’ (zonder argumenten, dus de huidige map)
slaagt, verwijder dan het uitvoerbare bestand dat is geschreven door ‘go build’, indien aanwezig. Dit voorkomt dat er een oud binair bestand achterblijft…
Om de lijst compleet te maken, compileert go run
uw toepassing in een tijdelijke map en start dat uitvoerbare binaire bestand. Wanneer de app wordt afgesloten, ruimt het de tijdelijke bestanden op de juiste manier op.
Vraag geïnspireerd op Wat doet ga bouwen bouwen?
Antwoord 2, autoriteit 10%
Voor pakket:
go build
: bouwt uw pakket en verwerptde resultaten
Dat zal niet waar zijn na Go 1.10 (Q1 2018), dankzij CL 68116en CL 75473. Zie deze thread, waarnaar ik hier verwijs.
Wat doen de
go build
engo install
commando’s preciesTelkens wanneer de go-tool een pakket of binair bestand installeert, installeert het ook alle afhankelijkheden die het heeft, dus als u go install uitvoert, worden ook automatisch pakketten geïnstalleerd waarvan uw programma afhankelijk is (openbaar beschikbare, “go gettable”-pakketten).
Eigenlijk… go install
verandert ook met Go 1.10, naastvan de nieuwe cache:
De opdracht “
go install
” installeert niet langer afhankelijkheden van de genoemde pakketten(CL 75850).Als je “
go install foo
” uitvoert, is het enige dat geïnstalleerd wordtfoo
.Vroeger varieerde het. Als afhankelijkheden verouderd waren, installeerde “
go install
” ook eventuele afhankelijkheden.
De impliciete installatie van afhankelijkheden tijdens “go install
” veroorzaakte veel verwarring en hoofdpijn voor gebruikers, maar het was voorheen noodzakelijk om incrementele builds mogelijk te maken.
Niet meer.
We denken dat de nieuwe “install what I said
“-semantiek veel begrijpelijker zal zijn, vooral omdat uit bugrapporten duidelijk is dat veel gebruikers ze al verwachtten.
Als u de installatie van afhankelijkheden wilt forceren tijdens “go install
“, gebruikt u de nieuwe “go install -i
“, naar analogie met “go build -i
” en “go test -i
“.Het feit dat “
go install
” werd gebruikt om herbouwde afhankelijkheden te installeren, veroorzaakte meestal verwarring in combinatie met-a
, wat betekent “force rebuild of all dependencies
“.
Nu zal “go install -a myprog
” een volledige heropbouw forceren van alle afhankelijkheden vanmyprog
, evenalsmyprog
zelf, maar alleenmyprog
wordt geïnstalleerd. (Alle opnieuw opgebouwde afhankelijkheden worden natuurlijk nog steeds opgeslagen in de buildcache.)
Het is vooral belangrijk om deze casus begrijpelijker te maken in combinatie met de nieuwe op inhoud gebaseerde verouderde analyse, omdat het goede redenen ziet om afhankelijkheden vaker dan voorheen opnieuw op te bouwen, wat de hoeveelheid verwarring over “waarom zijn mijn afhankelijkheden zijn geïnstalleerd” zou hebben vergroot.
Als u bijvoorbeeld “go install -gcflags=-N myprog
” uitvoert, installeert dat eenmyprog
gebouwd zonder compiler-optimalisaties, maar het installeert niet langer ook de pakkettenmyprog
gebruikt uit de standaardbibliotheek zonder compiler-optimalisaties.