Keine Werbung mögen? Gehen Werbefrei Heute

Makefile für Entwickler – Aufgaben automatisieren, ohne Bash-Spaghetti zu schreiben

Aktualisiert am

Make ist ein 1977 entwickeltes Build-Tool, das sich als hervorragendes Projekt-Task-Runner-Tool erwies. Ein Makefile, make test, fertig – keine Bash-Skripte zu warten, keine Abhängigkeiten zu installieren.

Makefile für Entwickler — Aufgaben automatisieren ohne Bash-Spaghetti 1
ANZEIGE Entfernen?

Sie wissen, wie es geht. Ein Projekt beginnt sauber. Dann fügt jemand einen run.sh. Dann build.sh. Dann ein deploy.sh das eine .env und ruft die ersten beiden in einer bestimmten Reihenfolge auf, und plötzlich gibt es sechs Shell-Dateien, die niemand berühren will, und eine README-Datei, die lautet „siehe den Scripts-Ordner.“

Machen Sie die Korrekturen. Ein Makefile im Projektroot, make test, fertig.

Das hat nichts mit C-Build-Systemen zu tun. Make existiert bereits vor Linux und wurde ursprünglich für eine abhängigkeitsbasierte Kompilierung entwickelt — aber sein Kernmechanismus (namengegebene Ziele, die Shell-Befehle ausführen) macht es zu einem vollkommen ausreichenden Aufgaben-Runner für jede Stack. Node, Python, Go, Rust, Docker, was auch immer Sie bauen.

Wie Make tatsächlich funktioniert

Ein Makefile ist eine Liste von Zielen. Jedes Ziel hat einen Namen, optional Abhängigkeiten und einen Shell-Befehl:

.PHONY: build test lint clean

build:
	npm run build

test:
	npm test

Zwei Dinge, die jeder bei seinem ersten Kontakt verursachen:

  • Die Einrückung muss ein echter Tab-Charakter sein, nicht Leerzeichen. Jedes Editor, das Tabs automatisch in Leerzeichen umwandelt, bricht Ihr Makefile schweigend, bis Sie es anders konfigurieren. Dies gilt seit 1977 und Make wird niemals vergeben, wenn Sie Leerzeichen verwenden.
  • Standardmäßig denkt Make, dass Zielnamen Dateinamen sind. Wenn eine Datei mit dem Namen build im Projektroot existiert, make build tut nichts, weil Make denkt, das Ziel sei bereits „gebaut“. Die Lösung ist .PHONY.

Jedes Ziel, das kein echter Dateiname ist, als .PHONYzu deklarieren. In der Praxis deklarieren Task-Runner Makefiles jedes Ziel, weil keines eine Datei erzeugt. Ihre .PHONY Zeile endet damit, wie die erste Zeile des untenstehenden Templates.

Variablen und Kommandozeilenüberschreibungen

Make hat seine eigene Variablen-Syntax — sieht wie Shell aus, verhält sich aber anders:

DOCKER_IMAGE = myapp
TAG = latest

build:
	docker build -t $(DOCKER_IMAGE):$(TAG) .

Überschreiben über die Kommandozeile: make build TAG=v1.2.3. Keine Datei-Änderung erforderlich für versionierte Builds oder Umgebungsabhängige Bereitstellungen. Shell-Umgebungsvariablen sind automatisch verfügbar — $(HOME), $(PATH), was in Ihrer Umgebung beim Ausführen von make steht.

Ein fertiges Makefile-Vorlage

Kopieren Sie das, löschen Sie das, was nicht passt, und passen Sie die Befehle für Ihren Stack an:

.PHONY: install build test lint clean run docker-up docker-down help

# --- Config -------------------------------------------------------------------
DOCKER_COMPOSE = docker compose
APP_NAME = myapp

# --- Default target -----------------------------------------------------------
help:
	@echo "Available targets:"
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "  %-15s %s\n", $$1, $$2}'

# --- Dev ----------------------------------------------------------------------
install: ## Install dependencies
	npm ci

run: ## Start the dev server
	npm run dev

build: ## Build for production
	npm run build

# --- Quality ------------------------------------------------------------------
lint: ## Run the linter
	npm run lint

test: ## Run the test suite
	npm test

test-watch: ## Run tests in watch mode
	npm run test:watch

# --- Docker -------------------------------------------------------------------
docker-up: ## Start services via docker compose
	$(DOCKER_COMPOSE) up -d

docker-down: ## Stop and remove containers
	$(DOCKER_COMPOSE) down

docker-logs: ## Tail container logs
	$(DOCKER_COMPOSE) logs -f

# --- Cleanup ------------------------------------------------------------------
clean: ## Remove build artifacts and caches
	rm -rf dist node_modules/.cache .next

Der help Ziel verwendet einen grep + awk-Muster, um eingebundene ## Kommentare in formatierte Dokumentation zu ziehen. Führen Sie make help aus und Sie erhalten eine sortierte Liste aller Ziele mit deren Beschreibung — ohne zusätzliche Dokumente zu pflegen. Dies ist der am meisten gestohlene Snippet in der Makefile-Geschichte, und das hat gute Gründe.

Ziele für CI kettendurchführen

Make behandelt Abhängigkeiten nativ. Listen Sie Ziele als Abhängigkeiten auf, um sie in Reihenfolge auszuführen:

ci: lint test build ## Full CI check (lint -> test -> build)

make ci führt Lint, dann Test, dann Build aus. Wenn ein Schritt nicht null beendet, stoppt Make. Dies ist das richtige CI-Verhalten — fehlerhafte Schritte lautstark melden, nicht schweigend verdecken.

Die Ausblendung von echo und die Ausführung mehrzeiliger Befehle

Standardmäßig zeigt Make jeden Befehl bevor er ausgeführt wird. Fügen Sie voran @ um zu unterdrücken:

setup:
	@echo "Setting up project..."
	@cp .env.example .env
	@npm ci
	@echo "Done."

Für Befehle, die mehrere Zeilen umfassen, verbinden Sie mit && — es beendet sich bei Fehlern, im Gegensatz zu Semikolon, das weitergeht, unabhängig:

migrate:
	npm run db:migrate && \
	npm run db:seed && \
	echo "Migration complete"

Wenn Make das falsche Werkzeug ist

Make ist auf macOS (über Xcode Command Line Tools) und auf jeder Linux-Distribution enthalten. Keine Installationsstufe, keine Versionskonflikte, keine Reibung für die meisten Entwicklerteams.

Wo es sich kurz ausweist:

  • Fenster — WSL funktioniert gut, aber native Windows hat kein Make ohne Chocolatey, Scoop oder den GnuWin32-Port. Wenn Ihr Team Windows-native ist, ist einfach ein nahezu einsetzbarer Ersatz, der speziell für diesen Mangel entwickelt wurde.
  • Komplexe Logik — Make ist keine Programmiersprache. Bedingungen und Schleifen existieren, aber sie sind wirklich hässlich. Wenn Ihre Build-Logik echte Abzweigung benötigt, schreiben Sie ein richtiges Skript.
  • Plattformübergreifende Shell-Befehlerm -rf, cpund andere Unix-Standardprogramme existieren nicht auf nativen Windows-Systemen. Aufgabe (Go-basiert) behandelt dies mit plattformübergreifender Befehlsunterstützung, die eingebaut ist.

Für die meisten Backend- und Fullstack-Teams auf Mac oder Linux ist Make das pragmatische Standard. Es ist langweilig auf die beste Weise — nichts zu installieren, nichts zu aktualisieren, nichts, das bei einer Abhängigkeitsaktualisierung bricht.

Ihre Makefile sauber halten

Wenn ein Makefile über mehrere Mitwirkende und Merge wächst, driftet die Einrückung und die Leerzeichen. Da Make whitespace-sensibel ist, bricht ein verschobener Leerzeichen durch einen Tab ein Ziel schweigend, ohne hilfreiche Fehlermeldung. IO Tools’ Makefile-Formatter normalisiert die Einrückung und bereinigt die Leerzeichen ohne die Logik zu berühren — nützlich als Vorspruch-Check vor dem Commit.

Möchten Sie werbefrei genießen? Werde noch heute werbefrei

Erweiterungen installieren

IO-Tools zu Ihrem Lieblingsbrowser hinzufügen für sofortigen Zugriff und schnellere Suche

Zu Chrome-Erweiterung Zu Kantenerweiterung Zu Firefox-Erweiterung Zu Opera-Erweiterung

Die Anzeigetafel ist eingetroffen!

Anzeigetafel ist eine unterhaltsame Möglichkeit, Ihre Spiele zu verfolgen. Alle Daten werden in Ihrem Browser gespeichert. Weitere Funktionen folgen in Kürze!

ANZEIGE Entfernen?
ANZEIGE Entfernen?
ANZEIGE Entfernen?

Nachrichtenecke mit technischen Highlights

Beteiligen Sie sich

Helfen Sie uns, weiterhin wertvolle kostenlose Tools bereitzustellen

Kauf mir einen Kaffee
ANZEIGE Entfernen?