Workspaces, cross-compilatie en uitvoering in macOS/OSX

In dit artikel gaan we een uitleg geven van hoe je workspaces kan aanmaken en tevens binaire Go-bestanden bouwen, compileren, cross-compileren en uitvoeren. Deze onderwerpen zijn erg belangrijk als je van plan bent om grootschalige Go-applicaties te ontwikkelen en implementeren in een productieomgeving.

Voordat we verder gaan met deze onderwerp, moeten we eerst uitleggen wat een workspace is en waarom je deze nodig hebt.

workspaces

Een workspace in Go is een directory die bestaat uit de volgende hiërarchie:

Bin

De bin directory staat voor binair en dit bestand bevat alle binaire bestanden van de project.

Pkg

De pkg directory staat voor pakketten en in deze bestand worden alle externe pakketten opgeslagen die tot het project behoren.

Src

De src is de broncodes map waarbij alle broncodes opgeslagen worden inclusief hun dependency.

Wanneer je Go op je mac installeert is je standaardomgeving /usr/local/go waar alle benodigde bestanden/pakketten worden opgeslagen. De vraag is nu: waarom een workspace aanmaken? Een workspace is een werkruimte waar alleen de benodigde pakketten en binaire bestanden van je project worden opgeslagen.

In al onze voorbeelden tot nu toe gebruikten we de standaardomgeving (bekend als GOROOT) om onze Go broncodes uit te voeren. Een workspace biedt de mogelijkheid om pakketten en broncodes in je eigen werkruimte te importeren. Zodra je werkruimte is aangemaakt, worden alle pakketten die geïmporteerd zijn voor je project opgeslagen in de pkg map van je werkruimte.

Voor het maken van een workspace moet je de GOPATH vaststellen. Hierbij verwacht Go dat een uitvoerbare bestand in de opgegeven directory bestaat. De GOPATH geef aan de locatie van je workspace.

In macOS/OSX worden de Go omgevingsvariabelen in je .bash_profile vastgesteld. De volgende instructies geef aan hoe je een basisdirectory aanmaakt voor de werkruimte en tevens GOPATH in de omgevingsvariabelen instellen.

Begin met het maken van je project map. In dit voorbeeld gaan we deze map op ons bureaublad opslagen.

Nadat de project map is aangemaakt, moet je de src map aanmaken waarin de broncodes worden opgeslagen.

Vervolgens moet je het Go-bestand aanmaken die de main package bevat. Aangezien het ten minste één .go bestand vereist om een workspace te creëren in de opgegeven map. Voor dit voorbeeld gebruiken we Atom als onze code-editor, maar het hangt helemaal af van uw persoonlijke voorkeur. Lees dit artikel voor meer informatie over code-editors die kunnen worden gebruikt.

Maak een nieuw leeg bestand aan

Typ de volgende Go-codes

package main

func main(){

}

Sla het bestand op in je src map

Nu komt de meest belangrijke stap en dat is het specificeren van je GOPATH om de workspace te creëren. Voordat we door kunnen gaan met deze stap, moet je het absolute pad van de map ophalen. Dat doe je door op de rechtermuisknop te klikken op de project map en selecteert de toon info.

Deze pad zal je GOPATH zijn. Vervolgens om de GOPATH in te stellen, open terminal en voer de ls -la opdracht in om de lijst van alle mappen op te halen van je HOME-map (inclusief verborgen bestanden/mappen).

Druk op Return en de lijst met bestanden/mappen verschijnt en kijk of het .bash_profile bestand in de resultaat staat. In macOS/OSX moet de GOPATH worden opgeslagen in het .bash_profile-bestand.

Als het .bash_profile-bestand niet in de lijst voorkomt, moet je het aanmaken. Voer de volgende opdracht uit om dit bestand handmatig te maken:

touch .bash_profile

Vervolgens open het .bash_profile-bestand in teksteditor door de volgende opdracht uit te voeren:

open -a TextEdit .bash_profile

Eenmaal het .bash_profile-bestand open staat in teksteditor, moet je het absoluut pad van je project map toevoegen als je GOPATH-variabele. Voor je bin map, moet je het GOBIN -pad instellen en dit is GOPATH/bin. Voor deze voorbeeld voeg de volgende regels toe in je .bash_profile-bestand:

export GOPATH=”$HOME/Desktop/go_project”

export GOBIN=”$GOPATH/bin”

Sla de .bash_profile-wijzigingen op en sluit de terminal volledig om de wijzigingen door te voeren. Voer de volgende opdracht uit om te controleren of de wijzigingen zijn doorgevoerd:

go env

Controleer vanuit het Go-omgevingsresultaat of de GOBIN en GOPATH zijn ingesteld.

Als alles is correct ingesteld moeten we alleen de laatste stap nog uitvoeren, namelijk het creëren van de workspace. Opent de terminal en navigeert naar de map src van de project map waar het .go-bestand zich bevindt:

cd /Users/[gebruiker]/Desktop/go_project/src

En voert de volgende opdracht uit:

go install

Wanneer je deze opdracht op de project map uitvoeren worden de uitvoerbare bestanden gecompileerd en opslagen in de bin map.

Gefeliciteerd! Je workspace is aangemaakt en vanaf nu kun je pakketten importeren met behulp van de go get commando. Voer bijvoorbeeld de volgende opdracht uit:

go get -u github.com/gorilla/mux

En je pkg -map verschijnt met het geïmporteerde pakket in je workspace.

Tijdens het uitvoeren van zo’n opdracht zal Go door de volledig codebase heen lopen en zoek naar alle externe referenties. Indien externe referenties zijn gedetecteerd zal Go het package importeren en beschikbaar maken in je workspace.

Pakketten importeren

De meeste pakketten worden geïmporteerd vanuit andere repositories via een versiebeheersysteem zoals Git, Mercurial, SVN en Bazaar. Wanneer je een pakket importeert, haalt Go alle codebase op uit Git en checkt de laatste commit uit de standaard branch.

Go build

Om Go-applicaties te bouwen, moet je de go build opdracht uitvoeren waarmee het uitvoerbare bestand wordt gegenereerd. Wanneer je een uitvoerbaar bestand maakt, betekent het dat deze bestand geen externe bibliotheken nodig hebben om te kunnen draaien. Dus een standalone uitvoerbare bestand.

Voordat een uitvoerbaar bestand gemaakt kunnen worden zal Go door een aantal regels heen lopen. Dit zorgt ervoor om fouten en bugs te voorkomen. De go build opdracht helpt je ook om je code leesbaarder te maken.

Je moet altijd onthouden dat de Go-compiler is om je te helpen en niet een ellende van te maken.

Het doel van de compiler is om je Go-code te compileren en de kwaliteit van je broncodes te verbeteren.

Een van de regels zijn dat iedere package die geïmporteerd worden in je project moet gebruikt worden.

package main
import (
“fmt”
“os”
)

func main() {
fmt.Println(“Hello world!”)
}

Dit zal de volgende foutmelding weergeven wanneer je een uitvoerbaar bestand probeer te maken:

# command-line-arguments
./main.go:5:1: imported and not used:”os”

Hoewel je deze regel kan omzeilen door een onderstrepingsteken te gebruiken.

package main
import (
“fmt”
_”os”
)

func main() {
fmt.Println(“Hello world!”)
}

Het gebruik van puntkomma’s worden streng gecontroleerd door de compiler omdat Go in veel contexten gebruik de puntkomma’s als terminator van instructies. De compiler voegt automatisch de vereiste puntkomma’s in wanneer hij denkt dat dit nodig is. Bekijk het volgende voorbeeld:

package main
import (
“fmt”
)

func main()
{
fmt.Println(“Hello world!”)
}

De code ziet er goed uit, maar als je een uitvoerbaar bestand probeer van te maken krijgt je de volgende syntaxisfoutmelding en de code zal niet compileren:

# command-line-arguments
./main.go:7:6: missing function body
./main.go:8:1: syntax error: unexpected semicolon or newline before {

Dit komt omdat het plaatsen van de haakje { in een nieuwe regel ervoor zorgt dat de Go-compiler een puntkomma invoegt aan het einde van main (). Vandaar de foutmelding.

Go format (fmt)

Met de go fmt commando kan broncodes weer in het juiste formaat gesteld worden. Dat betekent dat als je code er rommelig uitziet, kun je met deze commando ervoor zorgen dat ze weer netjes uitziet.

Cross-compileren

Cross-compilatie is een belangrijke functie als je uitvoerbare bestanden wilt genereren voor verschillende machines met een andere besturingssysteem en architectuur. Gelukkig heeft Go een ingebouwde ondersteuning voor cross-compilatie, wat betekent dat je alleen maar één machine nodig hebt voor het ontwikkelen van je Go applicatie.

Voor het cross-compileren van een Go-bestand, moet je de GOOS (besturingssysteem van keuze) en GOARCH (architectuur van keuze) instellen. Voer de volgende opdracht uit om deze gegevens te achterhalen:

  • go version
  • go version go1.13.4 darwin/amd64

In dit voorbeeld is de GOOS darwin en amd64 de GOARCH. De cross-compilatie kan gedaan worden door de volgende opdracht uit te voeren:

env GOOS=[besturingssysteem] GOARCH=[architectuur] go build [go bestand]

Voor onze voorbeeld wordt de opdracht als volgt:

env GOOS=darwin GOARCH=arm64 go build main.go

Het resultaat ziet als volgt uit:

Deze opdracht genereert een uitvoerbaar bestand dat werkt op macOS/OSX met een ARM-architectuur. Zie de lijst van alle ondersteunde Go GOOS en GOARCH.

Voer Go-codes uit

In bijna alle onze eerdere artikelen wordt de go run opdracht gebruikt. Bij het uitvoeren van go run zal de Go-compiler een tijdelijk uitvoerbaar bestand aanmaken. Na de uitvoering van de Go-applicatie wordt deze uitvoerbare bestand verwijderd. Dat betekent dat Go geen bestanden op je harde schijf achterlaat.

Voor het maken van zelfstandig uitvoerbaar bestanden moet je de go build opdracht gebruiken. Doormiddel van deze opdracht wordt deze uitvoerbare bestand gemaakt die rechtstreeks uitgevoerd kunnen worden zonder go run te gebruiken. Een go build opdracht ziet er als volgt uit:

Go build [go bestandsnaam]

In een voorbeeld waar je de bestandsnaam main.go hebt, zal de go build opdracht als volgt uitziet:

go build main.go

Zodra de uitvoering voltooid is, wordt de uitvoerbare bestand(en) gemaakt en opgeslagen in de src-map.

Om de main uitvoerbare bestand uit te voeren, moet je naar de src-map navigeren in je workspace.

cd /Users/[gebruiker]/Desktop/go_project/src

En voer de volgende opdracht uit:

./main

Volg ons:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *