为 golang 项目添加 Makefile

更新日期: 2021-08-25 阅读次数: 239 字数: 454 分类: golang

使用 Makefile 的好处

可以管理多个任务的命令。例如,build & run,test。

否则单单一个

go test -v ./...

就很难记住。

何况还会有很多需要记录的命令:

  • go test
  • build & run
  • scp 到服务器,并重启服务

每个功能一个 shell 脚本,会显得很杂乱。放到一个统一的文件中,就非常方便了。

如果没有 Makefile 文件会怎样

> make
make: *** No targets specified and no makefile found.  Stop.

参考项目

golang gin 项目的 Makefile 文件:

https://github.com/gin-gonic/gin/blob/master/Makefile

但是这个 Makefile 的语法为啥看起来跟下面参考文章里的语法截然不同呢?

https://sohlich.github.io/post/go_makefile/

还是 gin 项目的更正规些。

Makefile 的语法

GNU make 的文档虽然很详尽,但是对我来说太枯燥了。。。

找了专门针对 golang 的 Makefile 教程:

https://tutorialedge.net/golang/makefiles-for-go-developers/

边看边写,试试吧!

make: 'xxx' is up to date

在一个项目中执行 make test,然而并没有执行测试逻辑。

> make test
make: 'test' is up to date.

查了一下,原因是目录下有与 test 同名的文件或者目录导致, 确实目录有一个 test 目录用来存放测试文件。

解决方法: 增加一行 PHONY

.PHONY: test
test:
        go test -v ./...

PHONY,中文翻译为:假的。

PHONY target 就是为了规避 target 名 (这里为 test) 与文件或目录名冲突的情况。 golang gin 项目的 Makefile 也是这样写的。

参考:

https://www.gnu.org/software/make/manual/make.html#Phony-Targets

整理成 VIM snippet

Done.

Makefile 与 Shell 脚本的区别

亲手写过一个 Makefile 就会发现,Makefile 大大简化了 Shell 脚本的开发工作量。 虽然语法上类似,但是省去了自己写各种判断逻辑。

参考

  • https://sohlich.github.io/post/go_makefile/
  • https://github.com/gin-gonic/gin/blob/master/Makefile

tags: Makefile

爱评论不评论