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
-
Alex Edwards: An Overview of Go’s Tooling. alexedwards.net, 2019-04-15. ↩︎
-
Jacob Davis-Hansson: Your Makefiles are wrong. tech.davis-hansson.com, 2019-12-15. ↩︎