Makefile untuk Pengembang — Otomatisasi Tugas Tanpa Kode Bash yang Kacau
Make adalah alat pembangunan tahun 1977 yang ternyata sangat baik sebagai alat tugas proyek. Satu Makefile, make test, selesai — tidak perlu skrip bash untuk dipertahankan, tidak perlu menginstal ketergantungan.
Kamu tahu bagaimana halnya. Sebuah proyek dimulai bersih. Lalu seseorang menambahkan sebuah run.sh. Lalu build.sh. Lalu sebuah deploy.sh yang mengambil sumber dari sebuah .env dan memanggil dua yang pertama dalam urutan tertentu, dan tiba-tiba ada enam file shell yang tidak ingin dipegang dan sebuah README yang mengatakan “lihat folder skrip.”
Lakukan perbaikan pada hal itu. Satu Makefile di akar proyek, make test, selesai.
Ini bukan tentang sistem pembangunan C. Make diciptakan sebelum Linux dan awalnya dirancang untuk kompilasi berdasarkan ketergantungan — tetapi mekanisme intinya (target yang bernama dan menjalankan perintah shell) membuatnya menjadi alat tugas yang sangat layak digunakan untuk setiap stack. Node, Python, Go, Rust, Docker, atau apa pun yang sedang dibangun.
Cara Make bekerja sebenarnya
Sebuah Makefile adalah daftar target. Setiap target memiliki nama, ketergantungan opsional, dan blok perintah shell:
.PHONY: build test lint clean
build:
npm run build
test:
npm test
Dua hal yang membuat semua orang bingung saat pertama kali mengenalinya:
- Pengaturan indentasi harus merupakan karakter tab yang benar, bukan spasi. Setiap editor yang mengubah tab secara otomatis akan secara diam-diam menghancurkan Makefile Anda sampai Anda mengatur ulang konfigurasinya. Ini sudah benar sejak 1977 dan Make tidak akan memaafkan Anda jika Anda menggunakan spasi.
- Secara default, Make menganggap nama target sebagai nama file. Jika sebuah file bernama
buildada di akar proyek,make buildtidak akan dilakukan karena Make menganggap target tersebut sudah “dibangun.” Solusinya adalah.PHONY.
Deklarasikan setiap target yang bukan nama file nyata sebagai .PHONY. Dalam praktiknya, Makefile yang digunakan sebagai alat tugas mengklaim setiap target karena tidak ada yang menghasilkan file. Baris Anda .PHONY akan berakhir seperti baris pertama template di bawah ini.
Variabel dan penggantian dari baris perintah
Make memiliki sintaks variabelnya sendiri — terlihat seperti shell tetapi berperilaku berbeda:
DOCKER_IMAGE = myapp
TAG = latest
build:
docker build -t $(DOCKER_IMAGE):$(TAG) .
Overset dari baris perintah: make build TAG=v1.2.3. Tidak perlu mengedit file untuk versi yang dibangun atau penempatan berdasarkan lingkungan. Variabel lingkungan shell juga tersedia secara otomatis — $(HOME), $(PATH), apa pun yang ada di lingkungan saat Anda menjalankan make.
Template Makefile siap digunakan
Salin ini, hapus yang tidak relevan, sesuaikan perintah untuk stack Anda:
.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
Itu help target menggunakan pola grep + awk untuk mengambil komentar inline ke dalam dokumentasi yang terformat. Jalankan ## dan Anda akan mendapatkan daftar terurut dari setiap target beserta deskripsinya — tanpa perlu mempertahankan dokumen terpisah. Ini adalah potongan yang paling diambil dari sejarah Makefile karena alasan yang sangat baik. make help Menghubungkan target untuk CI
Make menangani ketergantungan secara natif. Daftarkan target sebagai ketergantungan untuk menjalankannya secara berurutan:
melakukan lint, lalu uji, lalu build. Jika langkah apa pun keluar dengan kode non-nol, Make berhenti. Ini adalah perilaku CI yang benar — gagal secara jelas, jangan menyembunyikan langkah yang rusak.
ci: lint test build ## Full CI check (lint -> test -> build)
make ci Menekan echo dan menulis perintah multi-baris
Secara default, Make mencetak setiap perintah sebelum menjalankannya. Sisipkan
untuk menekan: @ Untuk perintah yang melintasi baris, hubungkan dengan
setup:
@echo "Setting up project..."
@cp .env.example .env
@npm ci
@echo "Done."
— ini berhenti jika gagal, berbeda dengan tanda koma yang terus berjalan meskipun ada kesalahan: && Ketika Make adalah alat yang salah
migrate:
npm run db:migrate && \
npm run db:seed && \
echo "Migration complete"
Make tersedia di macOS (melalui Xcode Command Line Tools) dan setiap distribusi Linux. Tidak perlu instalasi, tidak ada konflik versi, tidak ada gesekan bagi sebagian besar tim pengembang.
Kekurangannya:
— WSL bekerja dengan baik, tetapi Windows native tidak memiliki make tanpa Chocolatey, Scoop, atau port GnuWin32. Jika tim Anda adalah tim Windows native,
- Jendela hanya yang merupakan solusi dekat yang dirancang khusus untuk kekurangan ini. Logika kompleks
- — Make bukan bahasa pemrograman. Kondisional dan perulangan ada tetapi benar-benar tidak menarik. Jika logika pembangunan Anda membutuhkan cabang nyata, tulis skrip yang sesuai. Perintah shell lintas platform
- , dan lainnya tidak tersedia di Windows native. —
rm -rf,cpTugas (berbasis Go) menangani hal ini dengan dukungan perintah lintas platform yang dibangun secara internal. Untuk sebagian besar tim backend dan fullstack di Mac atau Linux, Make adalah pilihan default yang realistis. Ini membosankan dalam cara terbaik — tidak perlu diinstal, tidak perlu diperbarui, tidak ada yang rusak saat pembaruan ketergantungan.
Menjaga Makefile Anda tetap bersih
Ketika Makefile tumbuh di antara banyak kontributor dan penggabungan, drift indentasi dan spasi terjadi. Karena Make sangat sensitif terhadap spasi, satu spasi yang tidak sengaja sebagai tab secara diam-diam menghancurkan target tanpa pesan kesalahan yang membantu.
Formatter Makefile IO Tools mengatur indentasi dan membersihkan ruang kosong tanpa mengganggu logika — berguna sebagai pengecekan keamanan sebelum commit. Makefile untuk Pengembang — Otomatisasi Tugas Tanpa Bash Spaghetti 2
Instal Ekstensi Kami
Tambahkan alat IO ke browser favorit Anda untuk akses instan dan pencarian lebih cepat
恵 Papan Skor Telah Tiba!
Papan Skor adalah cara yang menyenangkan untuk melacak permainan Anda, semua data disimpan di browser Anda. Lebih banyak fitur akan segera hadir!
Alat Wajib Coba
Lihat semua Pendatang baru
Lihat semuaMemperbarui: Kita alat terbaru ditambahkan pada 8 Juni 2026
