Nem volt rá szükség, így nem tanultam meg használni a make-et, az npm helyettesítette. Nézzük meg most egy Go-projekt példáján, hogyan működik, mert jól illik a Go fejlesztői eszközkészletébe.1

Hozzuk létre a Go-projektünket, amely egyelőre csak a lehető legegyszerűbb programot tartalmazza: egy hello-world.go fájlt. A Makefile tartalma:

include .env

.PHONY: run clean

${MAKE_BINARY_NAME}: ${MAKE_MAIN_NAME}
    GOARCH=amd64 GOOS=linux go build -o ${MAKE_BINARY_NAME} ${MAKE_MAIN_NAME}

run:
    go run ${MAKE_MAIN_NAME}

clean:
    go clean
    rm -f ${MAKE_BINARY_NAME}

Először is: e fájlban a tabokat alapértelmezetten nem konvertálhatjuk szóközökre (nanóban meta+o kapcsolja e beállítást), különben hibát dob a make. A változók a sajátjaink, lásd őket lentebb. Ha paraméter nélkül indítjuk a make-et, akkor vagy az első nem ponttal kezdődő target fog futni, vagy a .DEFAULT_GOAL változóban megadott.

A .PHONY speciális targetben az olyan targeteket soroljuk fel, amelyeknek nincs fájl kimenetük, mivel a target eredendően output fájlt jelöl.2 A fenti példában az első target jelentése ez: futtasd a megadott parancsot, ha a $MAKE_BINARY_NAME változóban megadott célfájl régebben módosult a $MAKE_MAIN_NAME változóban megadott forrásfájlnál. Ehelyett lehetne egyszerűen build e target neve, amely minden alkalommal futna:

.PHONY: build

build:
    GOARCH=amd64 GOOS=linux go build -o ${MAKE_BINARY_NAME} ${MAKE_MAIN_NAME}

Mivel a forrás szinte mindig több fájlból áll, ez az egyszerű megoldás, amelyre szükségünk lesz. Az összetettebb (helyes?) megoldás ez lenne, ha ./src/ mappában vannak a további forrásfájlok:

${MAKE_BINARY_NAME}: ${MAKE_MAIN_NAME} $(shell find src/ -type f -iname "*.go")
    GOARCH=amd64 GOOS=linux go build -o ${MAKE_BINARY_NAME} ${MAKE_MAIN_NAME}

Bizonyos konfigurációs paramétereket a (leendő) programunknak és a Makefile fájlnak is .env fájlban akarunk átadni. Ennek haszna jelen példában nem látványos, ezért egyelőre csak képzeljük hozzá, hogy az adatbázisunk felhasználónevét és jelszavát is itt adjuk majd meg.

MAKE_MAIN_NAME=hello-world.go
MAKE_BINARY_NAME=bin/hello-world

  1. Alex Edwards: An Overview of Go’s Tooling. alexedwards.net, 2019-04-15. ↩︎

  2. Jacob Davis-Hansson: Your Makefiles are wrong. tech.davis-hansson.com, 2019-12-15. ↩︎