Wat doet go build build? (ga bouwen vs. ga installeren)

Nieuwe Go-programmeurs weten vaak niet of raken in de war wat het fundamentele go build-commando doet.

Wat bouwen de go builden go installcommando’s precies en waar zetten ze het resultaat/de uitvoer?


Antwoord 1, autoriteit 100%

Wat het gocommando 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 installbouwt en installeerthet pakket in uw $GOPATH/pkgdirectory.

Voor opdrachten (pakket main)

  • go build  bouwt de opdracht en laat het resultaat in de huidige werkdirectory.
  • go installbouwt 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 neten 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 packagesuit.

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 gowordt uitgevoerd vanuit een map die een go.mod-bestand bevat (of een van de bovenliggende elementen van de huidige map), wordt de gotool 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 gowordt 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 modulesuit.


In principe kunt u go buildgebruiken om te controleren of de pakketten kunnen worden gebouwd (samen met hun afhankelijkheden), terwijl go installook (permanent) de resultaten installeert in de juiste mappen van uw $GOPATH.

go buildwordt 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 installuitvoert, 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 installook 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 runuw 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 builden go installcommando’s precies

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 automatisch pakketten geïnstalleerd waarvan uw programma afhankelijk is (openbaar beschikbare, “go gettable”-pakketten).

Eigenlijk… go installverandert ook met Go 1.10, naastvan de nieuwe cache:

De opdracht “go installinstalleert niet langer afhankelijkheden van de genoemde pakketten(CL 75850).

Als je “go install foo” uitvoert, is het enige dat geïnstalleerd wordt foo.

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 van myprog, evenals myprogzelf, maar alleen myprogwordt 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 een myproggebouwd zonder compiler-optimalisaties, maar het installeert niet langer ook de pakketten myproggebruikt uit de standaardbibliotheek zonder compiler-optimalisaties.

Other episodes