Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

14 | 项目管理:如何编写高质量的Makefile?

分享编写Makefile的经验和技巧
走读IAM项目的Makefile实现
自己调用自己
定义环境变量
设置OPTIONS
做好目标拆分
使用带层级的命名方式
将所有输出存放在一个目录下,方便清理和查找
编写可扩展的Makefile
将常用功能放在/Makefile中,不常用的放在分类Makefile中
依赖需要用到的工具
善用函数
善用通配符和自动变量
定义环境变量
目标拆分
复杂命令脚本化
文件分层
Makefile功能分类
清理类命令
部署类命令
Docker镜像打包类命令
构建类命令
测试类命令
静态代码检查
格式化类命令
代码生成类命令
自动化变量
特殊变量
变量赋值
伪目标
Makefile规则语法
课后练习
掌握Makefile编写技巧
设计合理的Makefile结构
规划Makefile要实现的功能
熟练掌握Makefile语法
高质量Makefile编写方法

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。今天我们来聊聊如何编写高质量的 Makefile。
我们在 第 10 讲 学习过,要写出一个优雅的 Go 项目,不仅仅是要开发一个优秀的 Go 应用,而且还要能够高效地管理项目。有效手段之一,就是通过 Makefile 来管理我们的项目,这就要求我们要为项目编写 Makefile 文件。
在和其他开发同学交流时,我发现大家都认可 Makefile 强大的项目管理能力,也会自己编写 Makefile。但是其中的一些人项目管理做得并不好,我和他们进一步交流后发现,这些同学在用 Makefile 简单的语法重复编写一些低质量 Makefile 文件,根本没有把 Makefile 的功能充分发挥出来。
下面给你举个例子,你就会理解低质量的 Makefile 文件是什么样的了。
build: clean vet
@mkdir -p ./Role
@export GOOS=linux && go build -v .
vet:
go vet ./...
fmt:
go fmt ./...
clean:
rm -rf dashboard
上面这个 Makefile 存在不少问题。例如:功能简单,只能完成最基本的编译、格式化等操作,像构建镜像、自动生成代码等一些高阶的功能都没有;扩展性差,没法编译出可在 Mac 下运行的二进制文件;没有 Help 功能,使用难度高;单 Makefile 文件,结构单一,不适合添加一些复杂的管理功能。
所以,我们不光要编写 Makefile,还要编写高质量的 Makefile。那么如何编写一个高质量的 Makefile 呢?我觉得,可以通过以下 4 个方法来实现:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何编写高质量的Makefile,以提高项目管理效率。作者指出了低质量Makefile存在的问题,并提出了四个方法来实现高质量Makefile的编写:熟练掌握Makefile语法、规划Makefile要实现的功能、设计合理的Makefile结构以及掌握Makefile编写技巧。文章重点介绍了熟练掌握Makefile语法的重要性,以及规划Makefile要实现的功能,包括格式化代码、静态代码检查、单元测试、代码构建、文件清理等。此外,文章还强调了设计合理的Makefile结构的重要性,建议采用分层的设计方法,并在根目录下的Makefile聚合所有的Makefile命令。最后,文章提到了掌握Makefile编写技巧的必要性,包括使用`.PHONY`标识定义伪目标等。通过这些方法,读者可以更好地编写高质量的Makefile,提高项目管理效率。 此外,文章还介绍了八个技巧,包括善用通配符和自动变量、善用函数、依赖需要用到的工具、将常用功能放在/Makefile中、编写可扩展的Makefile、将所有输出存放在一个目录下、使用带层级的命名方式以及做好目标拆分。这些技巧可以帮助读者更好地理解如何编写高质量的Makefile,并提高项目管理效率。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • helloworld
    格式化代码、静态代码检查,这种ide或vim都会配置保存时格式化和代码检查,还有必要写在makefile中吗

    作者回复: ide/vim不会进行静态代码检查。 ide/vim的格式化是可配的。而且ide/vim的格式化更多的是用了gofmt -w这种格式化。 这里将格式化代码放在Makefile有个选择: 1. 更丰富,可配置的格式化代码功能,比如:支持golines、goimport、gofmt后面还可以根据需要增加更多 2. 确保每一个开发者用的都是同一种格式化方法(ide/vim的格式化不一定每一个开发者都会陪,更不一定配置的格式化选项是一致的) 将格式化放在Makefile中,可以确保某个动作一定会被执行,并且执行的效果是一致的。

    2021-06-26
    4
    15
  • yandongxiao
    总结:Makefile 是高效项目管理的重要工具,编写高质量的 Makefile,方便你做CI的检查,不至于自己的代码提交上以后,被提示各种不通过(静态代码检查、格式错误、单元测试等)。 要做好 Makefile 的管理,可按照下面的步骤:1. 学习 Makefile 语法;2. 规划 Makefile 要实现的功能;3. 规划 Makefile 结构;4. 善用 Makefile 技巧。 直接拷贝IAM项目的Makefile,也很香。

    作者回复: 直接copy可能更香

    2021-11-26
    2
    4
  • Vackine
    写好一个功能齐全的项目的makefile,然后只对makefile 的各个功能做编排,是不是就可以做到基本的持续发布了?

    作者回复: 持续发布需要CI/CD系统的支持。 写好Makefile只能说方便CI系统直接调用。离CI/C差的还远

    2021-06-26
    4
  • 青苔入镜
    我有些困惑,iam项目将控制流和数据流放在了一个仓库中,然后使用makefile进行管理,方便我们学习部署,这个我倒是可以理解。 实际企业中是将所有组件也放在一个大仓库中的吗?我所在公司是将项目各个组件分为各个小仓库,开发后进行持续交付和持续部署。我感觉这样也比较合理一些啊,适合现在微服务这样,单个人就维护几个组件。而且控制面和数据面如果部署在一台机器上不会影响数据面的性能吗? 什么场景需要用makefile来管理项目呢?私有化部署的项目吗?我没有想的太明白

    作者回复: 一个应用下面一般分多个微服务,我感觉放在一个Git仓库中好些。 放在一个Git仓库中,但编译出来的是几个二进制文件,所以部署还是独立的。 放在一个仓库中有以下几个优势: 1. 可以统一管理,比如静态代码检查,只需要维护一套就可以了,不用重复开发。 2. 便于阅读,不用去不同代码仓库中不断跳转。 3. 便于包共享,放在同一个仓库中,开发者能够更轻松的发现共享包,并且潜意识中,会去使用公用的包。 最大的优点是:编译统一维护管理,不用每个仓库都实现一套维护方法。 我觉得只要是项目都可以使用makefile管理。

    2022-11-08归属地:广东
    2
  • 兔嘟嘟
    请问老师如何看待Makefile已过时的言论? 在知乎上查找相关资料时,发现很多人认为Makefile过时了,只需要学习cmake、bazel之类的,各种说法都有,现在有点晕

    作者回复: 我感觉Makefile没过时,kubernetes等大型项目都是用的Makefile。 Makefile功能强大,应对超大型的项目都没问题,对于一般的项目更不是瓶颈了。

    2021-10-26
    2
    1
  • Daiver
    老师,看到iam项目下面的license 文件中添加了其他库的说明,这个是手动加上去的吗

    作者回复: 也是自动生成的,iam中很多都是通过工具来搞的

    2021-09-23
    2
    1
  • tiny🌾
    make lint执行完为什么会报这个错误 make[1]: *** [go.lint] Error 1 make: *** [lint] Error 2

    作者回复: 可以加老师微信再帮你看下哈,这个报错看不出来什么错误

    2022-10-30归属地:广东
  • tiny🌾
    运行make lint报错 ,这个怎么排查 make[1]: *** [go.lint] Error 1 make: *** [lint] Error 2

    作者回复: 加老师微信,现场帮你定位下哈

    2022-10-20归属地:广东
  • 左耳朵东
    .PHONY: format format: tools.verify.golines .PHONY: tools.verify.% tools.verify.%: @if ! which $* &>/dev/null; then $(MAKE) tools.install.$*; fi 这里的 $* 是指 ‘golines’ 还是 ‘tools.verify.golines’ 呢?

    作者回复: tools.verify.golines

    2022-08-23归属地:广东
    2
  • Calvin
    对 Windows 系统不友好,实际 CRUD 业务中,更多人是在 Windows 下开发吧(IDE 选 VSCode 或 GoLand)。

    作者回复: 还有些在Mac上开发。 这个教程没必要在Mac、Windows平台下都适配一份。 之所以选择Linux是因为以下原因: 1. 因为Windows、Mac、Linux都有开发者,但该教程只能选择一个平台,所以选择了Linux 2. 将来部署服务是在Linux上部署的,在学习时,在Linux上完成开发部署,也是学习Linux的一个途径,为将来工作中, 在Linux下操作打下基础

    2022-04-18
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部