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 buildmake deploy 等简单命令。在搬瓦工 VPS 上管理多个项目时,为每个项目编写 Makefile 可以极大提升运维效率。更多自动化工具可以参考 Webhook 自动部署Cron vs Systemd Timer。选购搬瓦工请访问 全部方案,使用优惠码 NODESEEK2026 享 6.77% 折扣,通过 bwh81.net 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。