Pääartikkeli: Yksinkertaisuuden illuusio Olet todennäköisesti tyyppi tai Pinnalla nämä komennot tuntuvat melkein maagisilta: painat Enter-painiketta ja yhtäkkiä koodi kootaan, linkitetään ja - joskus - suoritetaan. go build go run Ymmärtäminen siitä, miten Go käsittelee koodin rakentamista, suorittamista ja välimuistiin tallentamista, ei ole vain akateeminen harjoitus. Se selittää, miksi kasvuyritykset ovat niin nopeita, miksi CI-putket käyttäytyvät johdonmukaisesti ja miksi joskus näennäisesti vähäpätöinen muutos voi laukaista täydellisen uudelleenkokoelman. Lopuksi saat selkeän kuvan: miten Go ratkaisee riippuvuudet ja rakenteet koodiin paketteina, miten kokoaminen ja linkittäminen toimii kohtausten takana, Miksi rakennusvälimuisti on niin luotettava, ja Mitä tapahtuu, kun kirjoitat go build tai go run? Jos olet koskaan ollut utelias siitä, miksi Go rakentaa "vain työtä" tai miksi väliaikainen binary näyttää lähes välittömästi, tämä on syvä sukellus, joka yhdistää pisteitä - sekä ihmisille että koneille. go run Go Toolchain henkinen malli Ensimmäisellä silmäyksellä ja ja näyttävät erillisiltä komentoilta, joilla jokaisella on oma käyttäytymisensä. Jokainen Go-komento kulkee ennustettavan sekvenssin läpi: se lataa moduulit, ratkaisee pakettien riippuvuudet, kokoaa paketteja, linkittää ne suoritettavaksi ja joskus suorittaa tuloksen. Ei sen rakentamisen mekaniikkaa. go build go run go test same underlying pipeline what happens to the final artifact Keskeinen käsite sisäistämisessä on se, että Jokainen paketin .go-tiedosto käsitellään kollektiivisesti, ja paketti itsessään on yksikkö, jonka kompiloija ja rakentaa välimuistiin. Go builds packages, not individual files Paketin yksittäisen tiedoston muuttaminen voi laukaista koko paketin uudelleenrakentamisen. Paketeista tulee luonnolliset rajat välimuistiin ja rinnakkaiseen kokoamiseen. Pienet, keskitetyt paketit pyrkivät skaalautumaan paremmin suurissa kooditietokannoissa, koska kompilaattori voi käyttää uudelleen enemmän välimuistiin tallennettuja tuloksia. Putki on käsitteellisesti yksinkertainen, mutta erittäin optimoitu: Go tietää tarkalleen, mitä tarvitaan uudelleenkokoonpanoon ja mitä voidaan käyttää uudelleen, minkä vuoksi asteittaiset rakenteet tuntuvat lähes välittömiltä. : se koordinoi kokoamista, linkittämistä, välimuistia ja täytäntöönpanoa, joten sinun on harvoin huolehdittava yksityiskohdista. ja Lopettaa taikuuden tunteen ja alkaa tehdä ennustettavissa olevaa merkitystä. smart coordinator go build go run Tästä 2 Rakenna suunnitelma Tutustu kohteeseen Mod Tutustu kohteeseen Mod Ennen kuin Go koskaan koskettaa lähdetiedostoja, sen on selvitettävä, mitä rakentaa ja missä järjestyksessä. ja Nämä tiedostot määrittelevät Lukemalla nämä tiedostot Go-työkalurivi tietää tarkalleen, mitkä paketit ovat osa rakennustasi ja mitkä ulkoiset koodit hankkia, tarkistaa ja sisällyttää. go.mod go.sum module graph Kun moduulikaavio on ladattu, Go arvioi jokaisen paketin määrittääkseen sen lähdekoodin. Tämä sisältää jokaisen pakettiin kuuluvan .go-tiedoston, joka on suodatettu build-tunnisteiden, käyttöjärjestelmän, arkkitehtuurin ja mahdollisten rajoitusten mukaan. Vasta tämän arvioinnin jälkeen kompilaattori tietää, mitä koodia se todella tarvitsee käsittelemään. Komentojen suorittaminen eri koneilla tuottaa samanlaisia tuloksia olettaen samat moduuliversiot. go build Tärkeä osa nykyaikaista liiketoimintaa on sen rooli Direktiiviin sisältyy Tämä direktiivi ilmoittaa moduulisi vähimmäisversion Go.Se vaikuttaa useisiin rakenteen ominaisuuksiin: kielen semantiikkaan, kompilaattorin käyttäytymiseen ja jopa staattiseen analyysiin. Ohjeet, kielen semantiikka, kompilaattorin käyttäytyminen ja tarkistukset voivat vaihdella - työkaluketju valvoo näitä kompilaation aikana.Tämä on osa Go: n keskittymistä toistettavuuteen, varmistaen, että koodi käyttäytyy johdonmukaisesti eri ympäristöissä. go go.mod go Tämän vaiheen loppuun mennessä työkaluketjulla on : se tietää, mitkä paketit kootaan, missä järjestyksessä ja mitkä tiedostot kuuluvat kuhunkin pakettiin. Tämän tiedon kanssa kädessä, se siirtyy seuraavaan vaiheeseen: pakettien kootaan ja linkitetään ne binääriin, luottaen siihen, että mitään ei jätetä pois tai kootaan väärin. complete, ordered build plan Yhteensovittaminen ja linkittäminen käytännössä Kun Go saa rakennussuunnitelman moduulijärjestelmästä, se alkaa kääntää koodin johonkin, mitä kone voi suorittaa. Tämä tapahtuu kahdessa eri vaiheessa: kokoaminen ja linkittäminen. Näiden vaiheiden ymmärtäminen on avain ymmärtämään, miksi Go-rakennukset ovat nopeita, deterministisiä ja skaalautuvia. Pakkaus on per pakkaus Käy kokoelmassa Jokainen paketti - olipa se osa projektia tai ulkoinen riippuvuus - käsitellään itsenäisenä yksikkönä. Tämä tarkoittaa sitä, että jos pakettia ei ole muutettu viimeisestä rakennuksesta lähtien, Go voi ohittaa sen uudelleenrakentamisen kokonaan, vaikka muut siihen riippuvat paketit rakennettaisiin uudelleen. one package at a time intermediate artifacts Parallelismi on toinen etu tästä pakettikohtaisesta lähestymistavasta: koska kompilaattori tuntee riippuvuusgrafiikan, se voi koota useita itsenäisiä paketteja samanaikaisesti, hyödyntämällä täysimääräisesti useita ydinprosessoreita. Linkki on valikoiva on prosessi yhdistämällä kootut paketit yhdeksi suoritettavaksi. Kirjasto-paketit eivät koskaan liity toisiinsa, ne ovat vain toistuvasti käytettäviä esineitä muille paketeille.Tämä ero on tärkeä: kun käytät Projektissa Go voi koota kymmeniä paketteja, mutta tuottaa nolla binääriä, jos mikään paketeista ei ole tärkein! Linkittäminen only links main packages into binaries go build ./... Linkittäminen on usein rakennuksen kallein vaihe, koska se sisältää kaikkien riippuvuuksien yhdistämisen yhdeksi suoritettavaksi, symboleiden ratkaisemisen ja metatietojen upottamisen. Mikä päättyy binääriin Lopullinen binary on enemmän kuin vain koodisi. Kaikki riippuvaiset paketit, jotka ovat saatavilla pääosasta Rakenna metatietoja, mukaan lukien moduuliversio ja komentotiedot Konetason ohjeet, jotka on optimoitu kohdealustalle Tämä yhdistelmä on syy siihen, miksi Go-binaarit ovat itsenäisiä ja toistettavissa: ne sisältävät kaiken, mitä tarvitaan ulkoisten kirjastojen tai runtime-ympäristöjen käyttämiseen. Ihmisen näkökulmasta tämä tekee käyttöönotosta yksinkertaisen. Koneen näkökulmasta build-järjestelmä voi tarkistaa ja välittää kaiken tehokkaasti varmistaen, että toistuvat rakennukset ovat nopeita ja deterministisiä. Rakennettu välimuisti: Gravitaation keskus Go nopeuden ja ennustettavuuden ytimessä on sen Jokainen koottu paketti, jokainen väliaikainen artefakti ja jopa jotkut työkalujen tuotot tallennetaan sisällön osoittamaan välimuistiin, jonka avulla Go voi käyttää työtä uudelleen rakenteissa, komentoissa ja jopa Ymmärtäminen, miten välimuisti toimii, on välttämätöntä ymmärtää, miksi Go-rakennukset tuntuvat lähes välittömiltä, jopa suurissa projekteissa. build cache go run Mitä Cache Stores Rakenna välimuisti on enemmän kuin vain koottu binary. Kootut pakettiesineet (.a-tiedostot) kaikille paketeille rakennusgrafiikassa Testitulokset, mukaan lukien välimuistiin tallennetut onnistumistiedot Väliaikaiset työkalut, joita tarvitaan suorittamiseen go run- tai go-testillä välimuisti elää levyllä (oletusarvoisesti ) ja on täysin deterministinen, mikä tarkoittaa, että sama paketti, joka on koottu samoilla syötteillä, tuottaa aina saman välimuistiinpanon. $GOCACHE Sisältökohtainen, ei ajastinpohjainen Toisin kuin perinteiset rakennusjärjestelmät, jotka luottavat tiedostotunnisteisiin, Go käyttää jokainen välimuistiavain on toiminto: content-based hashing Lähdekoodin sisältö Kompilatorin versio Jokainen rakentaa lippuja Kohdealusta (Goos ja Goarch) Merkitykselliset ympäristömuuttujat Tämä muotoilu takaa, että rakenteet ovat toistettavissa ja välttää vääriä välimuistipuutteita, jotka johtuvat vaarattomista muutoksista, kuten aikaleimauksista tai tiedostojen järjestyksestä. Invaliditeetti selitettiin Jopa vahvan välimuistin avulla Go joskus palauttaa paketteja. Muokkaa lähdekoodia tai rakenna tunnisteita Kompilaattorin lippujen tai ympäristön muuttujien muuttaminen Tiedostojen nimeäminen paketin sisällä Go:n välimuistijärjestelmä on älykäs: se rakentaa uudelleen vain sitä, mikä todella tarvitsee uudelleenrakentamista.Jopa pienet, ei-semanttiset muutokset voivat laukaista uudelleenrakentamisen, jos ne vaikuttavat paketin rakentamiseen, mutta muuten välimuisti luotetaan epäsuorasti. Miksi välimuisti on turvallista luottaa Rakennusvälimuisti on suunniteltu avoimeksi ja luotettavaksi: Sinun on harvoin puhdistettava se manuaalisesti Uudelleenrakentaminen tyhjästä tuottaa identtisiä esineitä mennä juosta, mennä testiin ja mennä rakentamaan kaikki vipuvaikutus johdonmukaisesti Tästä syystä Go:n kasvavat rakenteet ovat niin nopeita: kompilointi ei koskaan tee enemmän työtä kuin on tarpeen. Kehittäjän näkökulmasta se tuntuu maagiselta. Järjestelmien näkökulmasta se on yksinkertaisesti optimoitu putki, joka kohtelee pakettiesineitä ensiluokkaisina kansalaisina. • Taideteosten valmistus go build Käy rakentamassa Go build -komento on Go-työkaluketjun työpöytä. Sen tehtävä on yksinkertainen kuvailla, mutta hienostunut suorittamisessa: Ymmärtäminen mitä Itse asiassa se auttaa sinua ennustamaan sen käyttäytymistä ja välttämään yhteisiä yllätyksiä. compile packages, link them if necessary, and produce a binary that is correct and reproducible go build Kuinka rakentaa käsilaukkuja Kun juokset moduulissa tai pakkauksessa työkalu tarkastelee ensin riippuvuusgrafiikkaa, joka on peräisin Kaavion jokainen paketti tarkistetaan rakennusvälimuistiin: jos välimuisti sisältää paketin kannalta voimassa olevan koottujen esineiden, Go käyttää sitä uudelleen uudelleenrakentamisen sijaan. go build go.mod Koska menee , kosketus yksittäiseen tiedostoon paketin sisällä voi laukaista koko paketin uudelleenrakentamisen. päinvastoin, jos riippuvuus ei ole muuttunut, sitä ei koskaan rakenneta uudelleen, vaikka muut paketit luottaisivat siihen. Se sopii hyvin myös suurille hankkeille. operates at the package level incremental builds Linkki ja lopullinen binääri Kuten jo aiemmin mainitsimme, tuottaa vain suoritettavan paketin pääpaketeille. Kirjastopaketit kootaan väliartikkeleiksi, mutta niitä ei koskaan yhdistetä yksinään. Kun linkitetään pääpaketti, Go yhdistää kaikki kootut paketit yhteen binääriin. Tämä prosessi myös upottaa metatiedot suoritettavaan, mukaan lukien: go build Moduulien versiotiedot Commit hashes (jos saatavilla) Platform-erityiset metatiedot Oletusarvoisesti versioiden hallinnan yksityiskohtien sisällyttämiseen sovelletaan lippu, joka asetetaan oletusarvoisesti "auto" ja leimaa VCS-tiedot, kun tallennusympäristö sallii (käytä Vältä tai Lisätietoja löytyy asiakirjoista . -buildvcs -buildvcs=false -buildvcs=true Täällä Tämä tekee Go-binareista itsenäisiä ja erittäin toistettavissa olevia, jolloin voit ottaa ne käyttöön luottavaisesti ilman huolta puuttuvista riippuvuuksista. Missä taideteokset menevät (Sorry 😀) Jos oletuksena on, kirjoittaa binäärin nykyiseen hakemistoon, joka on nimetty paketin jälkeen. ei tuota binääriä ollenkaan, se vain varmistaa, että paketti ja sen riippuvuudet kootaan. Lippu tai käyttö Voit rakentaa useita paketteja yhdellä kädellä. go build go build -o ./... Windowsissa suorittimilla on a Kun rakennat useita pääpaketteja kerralla (esimerkiksi ) ilman , Go kirjoittaa yhden binäärin per pääpaketti nykyiseen hakemistoon. .exe ./cmd/... -o Ennustettavat ja luotettavat rakennukset Pakettikohtaisen kokoamisen, välimuistin ja valikoivan linkittämisen yhdistelmä varmistaa, että go build on ennustettavissa. Rakennukset ovat toistettavissa koneiden välillä Muuttamatonta koodia ei koskaan rakenneta uudelleen tarpeettomasti väliaikaisia esineitä käytetään uudelleen optimoimaan rakennusaikaa Lyhyesti sanottuna Se ei ole vain koodaus, se on . go build orchestrating a deterministic pipeline that balances human convenience with machine efficiency Mukavuus ilman erityisiä etuoikeuksia go run Käy juoksemassa Jos on työ hevonen, joka tuottaa esineitä, joita voit ottaa käyttöön, Monet kehittäjät ajattelevat sitä "keräämällä ja suorittamalla yhdessä vaiheessa", mutta se ei ole: kappaleen alla se hyödyntää samaa rakennusjärjestelmää kuin , se on yksinkertaisesti optimoitu mukavuuden sijaan esineiden pysyvyyden vuoksi. go build go run go build Mitä Itse asiassa tekee go run Kun olet tyyppi (tai tiedostojen luettelo), Go ensin arvioi paketin ja sen riippuvuudet aivan kuten se Kaikkia välimuistiin tallennettuja koottuja paketteja käytetään uudelleen, joten koodaaja tekee vähäistä työtä muuttumattoman koodin varmistamiseksi. . go run main.go go build links the main package into a temporary binary, executes it, and deletes the binary once the program finishes Tällöin kätilön näkökulmasta, Tämä selittää, miksi saman ohjelman toistuvat vetoomukset tuntuvat usein välittömiltä: raskas nostaminen on jo tehty, ja vain linkittämällä tai muuttamalla paketteja voi laukaista kokoamisen. go run Miksi tuntuu erilaiselta go run Samalla tavalla kuin samaan putkistoon, voi tuntua hitaammalta tietyissä skenaarioissa. Koska se tuottaa väliaikaisen binäärin joka kerta, linkitys toistetaan, vaikka kaikki riippuvuudet olisi välimuistiin tallennettu. Pienille ohjelmille tämä yliluokka on vähäpätöinen, mutta hankkeille, joilla on suuret riippuvuusgraafit, se voi olla havaittavissa. go run Toinen ero on se, että Tämä on juuri se asia: se kauppaa binary uudelleenkäyttöä helpottamiseksi. Sinun ei tarvitse miettiä, mihin sijoittaa binary tai mitä kutsua sitä, työkalu käsittelee sitä automaattisesti. go run does not leave a persistent artifact Milloin Onko oikea työkalu - ja kun se ei ole go run Se on ihanteellinen: go run Nopea kokeilu tai käsikirjoitus Käynnistä ohjelmia ilman, että tiedostojärjestelmä häiriintyy Testaa pieniä ohjelmia vuorovaikutteisesti Se on vähemmän sopiva: Tuotannon rakentaminen tai käyttöönotto pitkän aikavälin palvelimet, joissa toistuva linkittäminen lisää ylipäätä CI-putket, joissa pysyvien binäärien välimuisti on tehokkaampaa Näissä tapauksissa suositeltava malli on , joka antaa sinulle välimuistin, toistettavuuden ja pysyvän esineen edut uhraamatta suorituskykyä. go build && ./binary Piilotettu oikeellisuus Käy testaamassa Käy testaamassa Sillä Toiminta perustuu samoihin periaatteisiin kuin ja Ymmärtäminen, miten testit ovat vuorovaikutuksessa rakennusjärjestelmän kanssa auttaa selittämään, miksi jotkut testit toimivat välittömästi, kun taas toiset laukaisevat uudelleenrakennuksen, ja miksi Go: n lähestymistapa tuntuu sekä nopealta että ennustettavalta. go test go build go run Testissä uudelleenkäyttöä Kun juokset , Go ensin määrittää testipaketin riippuvuuskaavion, mukaan lukien kaikki tuodut paketit. Samoin kuin tai Tämä tarkoittaa sitä, että suuret testipaketit voivat usein aloittaa suorittamisen lähes välittömästi, koska suurin osa kokoonpanotyöstä on jo tehty. go test reused from the build cache go build go run Kun mukana on useita paketteja, Go rakentaa uudelleen vain ne paketit, jotka ovat itse asiassa muuttuneet.Kombinaatio pakettikohtainen kokoaminen ja välimuisti varmistaa, että lisäkokeet ovat nopeita, jopa suurissa projekteissa. Testitulokset Caching Sen lisäksi, että pakkaukset on tallennettu, myös Jos testi läpäisee ja mikään sen riippuvuuksista tai asiaankuuluvista lipuista ei ole muuttunut, Go voi ohittaa testin uudelleenkäynnistyksen kokonaan. caches test results Testitulosten välimuistiinpanoa käytetään vain pakettiluettelotilassa (esim. tai ). paikallisessa hakemiston tilassa ( ilman pakettiargs), välimuisti on poistettu käytöstä. go test . go test ./... go test Tätä käytöstä hallitsee Esimerkiksi lippu Suorituskyky riippumatta tuloksista. ( Toista testit ja vertailut. on idiomaattinen tapa ohittaa välimuistiin tallennetut tulokset. Lisää yksityiskohtia tästä.) -count go test -count=1 -count -count=1 Dokumentaatio Testitulosten välimuisti parantaa kehittäjien tuottavuutta ja CI:n tehokkuutta, erityisesti suurissa hankkeissa, joilla on laaja testin kattavuus. . the system should avoid unnecessary work while preserving correctness Cache Invalidation testauksessa Testi voidaan käynnistää uudelleen automaattisesti, jos: Itse koodi on muuttunut. Kaikki testin riippuvuudet ovat muuttuneet. Testiin vaikuttavat liput ovat muuttuneet. Non-cacheable flags or changed files/env also invalidate reuse. Muussa tapauksessa Go luottaa välimuistiin tallennettuun tulokseen tietäen, että se on Tämä lähestymistapa vähentää tarpeettomien uudelleenrakentamisten aiheuttamia "laakereita" ja korostaa ennustettavuutta sokea mukavuus. deterministic and reproducible Vaihtoehtoiset Handy Snippets Tässä muutamia hyödyllisiä Käyttäytymismalleja, jotka vaikuttavat käyttäytymiseen: go test Fresh run: go test -count=1 ./... - kuten näimme aikaisemmin, tämä poistaa testitulosten välimuistin käytöstä. Stress test: go test -run '^TestFoo$' -count=100 ./pkg - ajaa TestFoo 100 kertaa tarkistaa flakiness. Bench stability: go test -bench. -count=3 - suorittaa kaikki vertailuarvot 3 kertaa saadakseen vakaat mittaukset. Miksi tämä on tärkeää kehittäjille Kehittäjän näkökulmasta rakentamisen välimuistin ja testitulosten välimuistin yhdistelmä luo työnkulun, joka tuntuu välittömältä ja luotettavalta: Pienet muutokset käynnistävät vain tarvittavat kokoonpanovaiheet. Testin läpäiseminen harvoin käynnistyy uudelleen, ellei jotain muutu. Kehittäjät voivat iteroida nopeasti ilman huolta piilotetusta tilasta. Käsittelemällä sekä paketteja että testituloksia ensiluokkaisina välimuistiesineinä, Go tekee testauksesta nopean ja ennustettavan, mikä vahvistaa samaa "ihminen + kone" -optimointia, joka on taustalla. ja . go build go run Rakennetun järjestelmän tarkkailu ja debugging Useimmiten Go's build-järjestelmä tekee juuri sen, mitä odotat, hiljaa ja tehokkaasti. Kun jokin tuntuu pois, työkaluketju antaa sinulle suoran, matalan tason näkyvyyden siihen, mitä se tekee. Avain on tietää, mitkä kytkimet kääntyvät ja miten tulkita mitä näet. Tee Toolchain-keskustelu Go tarjoaa pienen joukon lippuja, jotka paljastavat rakennusputken muuttamatta sen käyttäytymistä: -x tulostaa rakennuksen aikana suoritetut varsinaiset komennot.Tähän sisältyy kompilaattorin kutsuja, linkkiaskelia ja työkalujen suorittamista.Se on nopein tapa vastata kysymykseen: "Mitä Go todella tekee juuri nyt?" -n näyttää, mitä suoritettaisiin ilman komentojen suorittamista.Tämä on hyödyllistä, kun haluat ymmärtää rakennussuunnitelman käynnistämättä uudelleenrakentamista. Tämä mahdollistaa väliaikaisten tiedostojen, luodun koodin ja väliaikaisten esineiden tarkastamisen, jotka on tuotettu kokoelman tai linkittämisen aikana. Nämä liput muuttavat Go-työkaluketjun mustasta laatikosta läpinäkyvään putkeen. Tärkeintä on, että ne eivät poista välimuistia, vaan yksinkertaisesti tekevät välimuistihaasteista ja puutteista näkyviä. Ymmärrä, miksi paketti on rakennettu uudelleen Yksi yleisimmistä sekaannuksen lähteistä on paketin uudelleenrakentaminen "ilmeisestä syystä". Paketti rakennetaan uudelleen, kun sen välimuistissa oleva avain muuttuu. Sisältöihin kuuluvat lähdekoodi, rakennusmerkit, kompilaattorin liput, kohdealusta ja asiaankuuluvat ympäristömuuttujat. Riippuvuusmuutokset leviävät ylöspäin pakettikaavion kautta. käyttämällä , voit usein nähdä, onko Go uudelleenkäytetty välimuistiin tallennettua esineistöä tai palauttanut paketin, ja päätellä, miksi asiayhteydestä. Niin kuin ensimmäinen vastaus. -x go clean -cache Pakottamalla uudelleenrakentaminen (kun todella tarkoitat sitä) Joskus haluat todella ohittaa välimuistin. Esimerkiksi kun vahvistat puhtaan rakentamisen tai työkaluketjun vianmäärityksen. Go tukee tätä nimenomaisesti: pakettien uudelleenrakentaminen, välittämättä välimuistiin tallennetuista koottuista esineistä go clean -cache puhdistaa koko build-välimuistin Nämä vaihtoehdot ovat tarkoituksellisesti nimenomaisia ja hieman epämukavia. Go on suunniteltu tekemään oikea uudelleenkäyttö oletuksena, ja manuaalinen välimuistin mitätöinti poikkeus. Jos löydät itsesi puhdistamalla välimuistin säännöllisesti, se on usein merkki siitä, että jotain muuta rakennusasetuksessa on kiinnitettävä huomiota. Vältä taikauskoisia korjauksia Koska Go: n rakennusjärjestelmä on deterministinen, arvaaminen harvoin auttaa. ja ja antaa sinulle konkreettisia todisteita siitä, mitä tapahtuu, mikä lähes aina riittää selittämään yllättävää käyttäytymistä. -x -n -work Kun luotat siihen: Rakennukset ovat sisällöltään osoitettuja, Paketit ovat työn yksikkö. ja kaappi on turvallinen uudelleenkäytettäväksi, Debugging build käyttäytymistä tulee kysymys havainnoinnin sijaan kokeilu ja virhe. Vaikutukset todellisiin hankkeisiin Go: n rakennusjärjestelmän takana olevat suunnitteluvaihtoehdot eivät ole sattumanvaraisia. Ne näkyvät selvästi, kun siirryt pienien esimerkkien ulkopuolelle ja aloitat työskentelyn todellisilla koodipohjilla: jatkuvat integrointiputket, suuret tallennukset ja toimittajan johtamat työnkulut. Tunne nopeasti paikallisesti ovat mitä tekee Go skaala niin hyvin tuotantoympäristöissä. go build Pipelines ja toistettavuus Go painottaa deterministisiä, sisältökohtaisia rakenteita, joten se sopii erityisen hyvin CI: lle. Koska rakennuslähteet ovat peräisin kokonaan lähdetiedostosisällöstä, moduuliversioista ja nimenomaisesta kokoonpanosta, CI-rakenteet käyttäytyvät johdonmukaisesti koneiden ja ympäristöjen välillä. Tämä ennustettavuus tekee myös Go-rakenteista erittäin välimuistiystävällisiä. Käytätkö jaettua build-välimuistia, säiliökerroksia tai etämuistiinfrastruktuuria, Go: n paketin tason kokoonpanomalli sopii luonnollisesti.Kun build on hidasta CI: ssä, se johtuu yleensä siitä, että jotain todella muuttui, ei siksi, että järjestelmä päätti tehdä ylimääräistä työtä. Monorepot ja suuret koodipisteet Suurissa säilytystiloissa build-välimuisti muuttuu suorituskyvyn rajaksi. Koska Go-välimuistit kootaan paketteja itsenäisesti, pieniä, hyvin määriteltyjä paketteja voidaan käyttää uudelleen monissa rakenteissa, joilla on vähäinen ylipaino. Käänteinen puoli on, että liian suuret tai tiiviisti yhdistetyt paketit voivat tulla pullonkauloiksi. Pieni muutos voimakkaasti käytetyssä paketissa voi mitätöidä suuren osan välimuistia, mikä lisää koko tallennuksen rakentamisaikoja. Go ei piilota tätä kustannusta, mutta se tekee paketin rajoista näkyviä ja mielekkäitä, palkitsee hyvää rakennetta ja paljastaa huonon erottamisen aikaisin. Toimittajat, työkalut ja automaatio Sama rakennusmalli antaa voimaa Go:n työkalujärjestelmälle. Koodieditorit, kielipalvelimet, linterit ja koodigeneraattorit kaikki luottavat samaan paketin tason ymmärrykseen koodistasi.Koska työkaluketju paljastaa selkeän, deterministisen rakennusputken, työkalut voivat integroida syvästi ilman arvaamista tai rakennuslogiikan uudelleenkäyttöä. Tämä on yksi syy, miksi Go-työkalut tuntuvat poikkeuksellisen johdonmukaisilta: muokkaajat ja CI-järjestelmät näkevät koodin samalla tavalla kuin kompilaattori. Päätös: Luota malliin Go's build -järjestelmä onnistuu, koska se tekee selkeän kompromissin: se optimoi ennustettavuuden älykkyyden yläpuolella ja selkeän rakenteen epäsuoran käyttäytymisen yläpuolella. Pinnalla tämä näyttää yksinkertaisuudelta. Alapuolella se on huolellisesti suunniteltu putki, joka kohtelee paketteja työn yksikkönä, sisältöä totuuden lähteenä ja välimuistia oikeellisuusominaisuutena suorituskyvyn hakkeroinnin sijaan. Kun sisäistät tämän mallin, monet jokapäiväiset käyttäytymiset alkavat tehdä järkeä. rakenteet ovat nopeita, ei siksi, että Go tekee vähemmän työtä, vaan siksi, että se välttää tekemästä työtä varten. se tuntuu mukavalta, koska se käyttää samaa koneistoa kuin Testin suorittaminen on luotettavaa, koska testitulokset tallennetaan välimuistiin käyttäen samoja deterministisiä sääntöjä kuin kootut paketit. Tarpeetonta go run go build Ihmisille tämä tarkoittaa vähemmän yllätyksiä, nopeampia palautetta ja työkaluja, jotka käyttäytyvät johdonmukaisesti koodieditorien, koneiden ja CI-järjestelmien välillä. Jos on yksi takeaway, se on tämä: Go's build -järjestelmä ei ole jotain taistella tai työskennellä. Se on API omalla puolellaan - yksi, joka palkitsee ymmärrystä. Kun luotat malliin, työkaluketju lakkaa tuntemasta maagista ja alkaa tuntea luotettavaa, mikä on juuri sitä, mitä haluat infrastruktuurista, joka rakentaa koodin.