Task (go-task) - Moderner Task-Runner-Spickzettel
Task (a.k.a. go-task) ist ein Task-Runner und Build-Tool, das darauf abzielt, eine einfachere Make-Alternative zu sein. Du definierst Tasks in einer YAML Taskfile.yml — mit Abhängigkeiten, Variablen, Includes und Up-To-Date-Checks — und führe sie mit task <name> aus. Es ist in Go geschrieben und wird als einzelne abhängigkeitsfreie Binärdatei versandt, mit plattformübergreifendem Verhalten und eingebautem Datei-Beobachter. Es ist eine starke Wahl, wenn dein Team YAML gegenüber Make’s Syntax bevorzugt.
Installation
| Plattform | Befehl |
|---|
| Skript | sh -c "$(curl -sSL https://taskfile.dev/install.sh)" |
| macOS/Linux (Homebrew) | brew install go-task |
| Arch Linux | sudo pacman -S go-task |
| Go install | go install github.com/go-task/task/v3/cmd/task@latest |
| Windows (Scoop) | scoop install task |
| Verifizieren | task --version |
Eine grundlegende Taskfile
# Taskfile.yml
version: '3'
vars:
BINARY: myapp
tasks:
build:
desc: Build the binary
cmds:
- go build -o {{.BINARY}} ./cmd/app
test:
desc: Run tests
cmds:
- go test ./...
ci:
desc: Lint, test, build
deps: [test]
cmds:
- task: build
Tasks ausführen
| Befehl | Beschreibung |
|---|
task | Führe die default-Task aus |
task build | Führe eine benannte Task aus |
task test build | Mehrere Tasks der Reihe nach ausführen |
task --list (-l) | Tasks mit Beschreibungen auflisten |
task --list-all | Alle Tasks auflisten (incl. kein-Desc) |
task --summary build | Zeige eine Task’s Detail |
task VAR=value build | Übergebe eine Variable |
task -- arg1 arg2 | Leite CLI-Argumente zur Task weiter ({{.CLI_ARGS}}) |
Abhängigkeiten & Bestellung
| Schlüssel | Verhalten |
|---|
deps: [a, b] | Führe a und b (parallel) vor dieser Task aus |
cmds: [{task: x}] | Rufe eine andere Task als Schritt auf (sequenziell) |
deps Parallelismus | Abhängigkeiten laufen standardmäßig gleichzeitig |
--parallel | Gegebene Tasks parallel ausführen |
Up-To-Date-Checks (Skip Unneeded Work)
tasks:
build:
sources:
- "**/*.go"
generates:
- myapp
cmds:
- go build -o myapp ./cmd/app
| Schlüssel | Effekt |
|---|
sources | Inputs zum Fingerprint |
generates | Erwartete Ausgaben |
| `method: checksum | timestamp |
status: [ ... ] | Benutzerdefinierte Shell-Checks für Up-To-Date |
Wenn Quellen unverändert sind, Task springt den Befehl.
Variablen & Templating
| Feature | Beispiel |
|---|
| Task/Globale Variablen | vars: { NAME: value } |
| Env-Variablen | env: { CGO_ENABLED: "0" } |
| Dotenv | dotenv: ['.env'] |
| Templating | {{.NAME}}, {{.CLI_ARGS}}, Go-Template-Funcs |
| Dynamische Variablen | sh: um eine Var aus einem Befehl zu berechnen |
Includes & Watching
| Feature | Wie |
|---|
| Includes | includes: { docs: ./docs/Taskfile.yml } → task docs:build |
| Namespacing | Eingebundene Tasks heißen namespace:task |
| Watch-Modus | task --watch build (Rerun bei Source-Änderungen) |
-w | Kurzform von --watch |
Häufige Workflows
# Entdecke, was ein Projekt tun kann
task --list
# Führe CI lokal exakt wie die Pipeline aus
task ci
# Iteriere: Bei jeder Source-Änderung neu bauen
task --watch build
# Übergebe Argumente durch
task test -- -run TestLogin
Task vs Make vs just
| Aspekt | Task | Make | just |
|---|
| Syntax | YAML | Makefile | just Rezepte |
| Sprache | Go (einzelne Binärdatei) | C (ubiquitär) | Rust |
| Up-To-Date-Checks | Ja (sources/generates) | Ja (Timestamps) | Nein (Command Runner) |
| Datei-Beobachtung | Eingebaut (--watch) | Nein | Nein (Paar mit watchexec) |
| Best für | YAML-Fans, Plattformübergreifend | Klassische Build-Graphen | Einfache Command-Ausführung |
Siehe auch just für eine Command-Runner-Alternative und watchexec für eigenständige Datei-Beobachtung.
Ressourcen