Makefile 自动化构建完整教程
Makefile 虽然是一个"古老"的工具,但至今仍然是项目自动化的利器。即使你的项目不是 C/C++,Makefile 也可以用来组织常见的开发和运维任务 —— 构建、测试、部署、清理等操作都可以用 make 命令一键完成。本文将介绍如何在搬瓦工 VPS 上利用 Makefile 提升工作效率。购买搬瓦工使用优惠码 NODESEEK2026 享 6.77% 折扣。
一、安装 Make
# Ubuntu/Debian(通常已预装)
apt update && apt install make -y
# CentOS
yum install make -y
# 验证
make --version
二、Makefile 基础语法
Makefile 的核心结构是目标(target)、依赖(prerequisites)和命令(recipe):
# 基本语法
# target: prerequisites
# [TAB] recipe
# 注意:命令行前面必须是 TAB 键,不能是空格
hello:
echo "Hello, World!"
build: clean
echo "Building project..."
mkdir -p dist
cp -r src/* dist/
clean:
rm -rf dist/
# 运行
make hello
make build
make clean
三、变量和函数
# 变量定义
APP_NAME = my-app
VERSION = 1.0.0
BUILD_DIR = ./dist
GO = go
DOCKER = docker
# 使用变量
build:
$(GO) build -o $(BUILD_DIR)/$(APP_NAME) -ldflags "-X main.version=$(VERSION)" .
# 环境变量(可被命令行覆盖)
ENV ?= production
deploy:
echo "Deploying to $(ENV) environment..."
# 使用:make deploy ENV=staging
四、.PHONY 声明
# 声明伪目标(不对应实际文件的目标)
.PHONY: build test deploy clean help
# 避免与同名文件冲突
# 如果目录下存在名为 build 的文件,没有 .PHONY 声明时 make build 不会执行
五、实战:Go 项目 Makefile
.PHONY: build test run clean docker-build docker-push deploy help
APP_NAME = myapp
VERSION ?= $(shell git describe --tags --always --dirty)
BUILD_DIR = ./bin
DOCKER_IMAGE = registry.example.com/$(APP_NAME)
## build: 编译项目
build:
CGO_ENABLED=0 go build -o $(BUILD_DIR)/$(APP_NAME) \
-ldflags "-s -w -X main.version=$(VERSION)" \
./cmd/$(APP_NAME)
## test: 运行测试
test:
go test -v -race -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
## run: 本地运行
run: build
$(BUILD_DIR)/$(APP_NAME)
## clean: 清理构建产物
clean:
rm -rf $(BUILD_DIR) coverage.out
## docker-build: 构建 Docker 镜像
docker-build:
docker build -t $(DOCKER_IMAGE):$(VERSION) .
docker tag $(DOCKER_IMAGE):$(VERSION) $(DOCKER_IMAGE):latest
## docker-push: 推送 Docker 镜像
docker-push: docker-build
docker push $(DOCKER_IMAGE):$(VERSION)
docker push $(DOCKER_IMAGE):latest
## deploy: 部署到生产环境
deploy: docker-push
ssh deploy@server "docker pull $(DOCKER_IMAGE):latest && docker compose up -d"
## help: 显示帮助信息
help:
@echo "Available targets:"
@grep -E '^## ' Makefile | sed 's/## / /'
六、实战:Docker Compose 项目
.PHONY: up down restart logs ps build clean backup
COMPOSE = docker compose
SERVICE ?=
## up: 启动所有服务
up:
$(COMPOSE) up -d $(SERVICE)
## down: 停止所有服务
down:
$(COMPOSE) down
## restart: 重启服务
restart:
$(COMPOSE) restart $(SERVICE)
## logs: 查看日志
logs:
$(COMPOSE) logs -f --tail=100 $(SERVICE)
## ps: 查看服务状态
ps:
$(COMPOSE) ps
## build: 重新构建并启动
build:
$(COMPOSE) up -d --build $(SERVICE)
## clean: 清理所有容器和数据卷
clean:
$(COMPOSE) down -v --remove-orphans
## backup: 备份数据
backup:
@echo "Backing up data..."
@mkdir -p ./backups
@tar -czf ./backups/backup-$$(date +%Y%m%d-%H%M%S).tar.gz ./data/
@echo "Backup completed!"
七、实战:前端项目
.PHONY: install dev build test lint deploy clean
NODE = node
NPM = npm
install:
$(NPM) ci
dev:
$(NPM) run dev
build: install lint test
$(NPM) run build
test:
$(NPM) test
lint:
$(NPM) run lint
deploy: build
rsync -avz --delete dist/ user@server:/var/www/mysite/
clean:
rm -rf node_modules dist .cache
八、高级技巧
# 条件判断
ifeq ($(ENV),production)
OPTS = --release
else
OPTS = --debug
endif
# 静默执行(不打印命令本身)
silent:
@echo "This won't show the command"
# 忽略错误(命令前加 -)
clean:
-rm -rf tmp/
# 自动生成 help
help: ## 显示此帮助信息
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
总结
Makefile 是一个被低估的自动化工具。无论你使用什么编程语言,Makefile 都可以作为项目命令的统一入口,让团队成员只需要记住 make build、make deploy 等简单命令。在搬瓦工 VPS 上管理多个项目时,为每个项目编写 Makefile 可以极大提升运维效率。更多自动化工具可以参考 Webhook 自动部署 和 Cron vs Systemd Timer。选购搬瓦工请访问 全部方案,使用优惠码 NODESEEK2026 享 6.77% 折扣,通过 bwh81.net 进入官网。