Makefile vs go run:Go 项目构建方式对比

一句话结论

用 Makefile。 它是 Go 行业的既定标准------Kubernetes、Docker、Prometheus、Hugo、etcd 等主流项目全部使用。go run 仅适合临时、一次性运行。

一、三种做法对比

做法 命令示例 二进制落点 复用性 可扩展性
go run go run ./cmd/core 临时目录,跑完即丢 无法单独运行、无法复用 无,参数/env 每次手打
go build -o go build -o /tmp/core ./cmd/core && /tmp/core /tmp/core,可控 可单独运行 一长串,每次手打
make make run /tmp/core 可单独运行、可复用 统一入口,一次定义全项目共享

二、本质区别

  • go run:编译到随机临时目录后立即执行。省事,但二进制"查无此物",无法单独启动、无法复用、无法做部署。

  • go build -o:手工指定输出路径。路径可控,但每次要敲一长串命令。

  • make run :把 go build -o <路径> && ./<路径> 封装成一个短目标。编译速度与 go run 完全一致(本质都是 go build),但二进制路径可控、命令可扩展。

重要澄清 :make run 不是 go run 的高配版。go build 才是编译本体,Makefile 只是给编译/运行两个动作起了一个稳定的短名。

三、为什么要选 Makefile

1. 行业标准

Kubernetes(2750 行 Makefile)、Docker/Moby、Prometheus、Hugo、etcd、Traefik、Caddy、Syncthing 全用 Makefile。招聘、协作、迁移成本最低。

2. 统一入口

新人 make run / make build / make clean 三秒上手,无需查 README 记命令。

3. 可扩展

将来加环境变量、linter、测试、Docker 打包,只需在 Makefile 加目标,全项目共享。

4. 杜绝散落二进制

go run 把编译产物丢进临时目录,无法控制。Makefile 把构建产物统一固定到 /tmp/,不污染源码树,也方便清理。

5. 与 CI/CD 对接

流水线只需 make build,与本地开发完全一致。

四、示例 Makefile

makefile

复制代码
BIN := /tmp
GO  := go

.PHONY: run build clean

run:
	$(GO) build -o $(BIN)/mybilibili-core ./cmd/core
	$(BIN)/mybilibili-core

build:
	$(GO) build -o $(BIN)/mybilibili-core ./cmd/core
	$(GO) build -o $(BIN)/mybilibili-media ./cmd/media

clean:
	rm -f $(BIN)/mybilibili-core $(BIN)/mybilibili-media
目标 作用
make run 编译并启动主服务
make build 编译所有二进制
make clean 删除编译产物

后台启动:

bash

复制代码
setsid nohup make run > /tmp/core.log 2>&1 < /dev/null &

五、为什么不推荐替代方案

  • shell alias (alias core='go build -o /tmp/...'):换机器即失效,团队不共享。Alias 是个人偷懒,不是工程规范。

  • Bazel:Google 内部标准,但配置极重(BUILD 文件、规则),小项目得不偿失。

  • Taskfile(go-task):较新的 YAML 风格 runner,社区仍在普及中,不如 Makefile 普适。

六、结论

使用场景 推荐方式
单个一次性实验 go run
任何反复启动、构建、交付的项目 Makefile

不是"规范更好看",而是 Makefile 就是企业级 Go 仓库的行业事实标准。

相关推荐
学长毕设16 小时前
基于springboot的社会志愿者管理系统-附源码
java·spring boot·后端
喵了几个咪16 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
开发语言·后端·安全·微服务·golang·gowind
多弗朗皮卡丘16 小时前
C++的类型转换
开发语言·c++
木头科技16 小时前
【AI 工程化第十六篇】Spring AI 多模态 RAG 实战:图片、扫描件、表格与图文证据链
java·人工智能·spring
FLJwu17 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
驭渊的小故事17 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
菜鸟小杰子17 小时前
手动修改 Spring Boot 嵌套 JAR 包:大包小包隔离打包实战
java·jar
Escalating_xu17 小时前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
计算机编程-吉哥17 小时前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
code2cat17 小时前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag