<h1>Golang Gin实践 番外 请入门 Makefile</h1> <p>原文地址:<a href="https://github.com/EDDYCJY/blog/blob/master/golang/gin/2018-08-26-Gin%E5%AE%9E%E8%B7%B5-%E7%95%AA%E5%A4%96-%E8%AF%B7%E5%85%A5%E9%97%A8%20Makefile.md" rel="nofollow noreferrer">Golang Gin实践 番外 请入门 Makefile</a></p> <h2>前言</h2> <p>含一定复杂度的软件工程,基本上都是先编译 A,再依赖 B,再编译 C...,最后才执行构建</p> <p>如果每次都人为编排,又或是每新来一个同事就问你项目 D 怎么构建、重新构建需要注意什么...等等情况,岂不是要崩溃?</p> <p>我们常常会在开源项目中发现 Makefile,你是否有过疑问?</p> <p>本章节会简单介绍 Makefile 的使用方式,最后<strong>建议深入学习</strong></p> <h2>怎么解决</h2> <p>对于构建编排,Docker 有 Dockerfile ,在 Unix 中有神器 <a href="https://en.wikipedia.org/wiki/Make\_%28software%29" rel="nofollow noreferrer">Make</a> ....</p> <h2>Make</h2> <h3>是什么</h3> <p>Make 是一个构建自动化工具,会在当前目录下寻找 Makefile 或 makefile 文件。如果存在,会依据 Makefile 的<strong>构建规则</strong>去完成构建</p> <p>当然了,实际上 Makefile 内都是你根据 make 语法规则,自己编写的特定 Shell 命令等</p> <p>它是一个工具,规则也很简单。在支持的范围内,编译 A, 依赖 B,再编译 C,完全没问题</p> <h3>规则</h3> <p>Makefile 由多条规则组成,每条规则都以一个 target(目标)开头,后跟一个 : 冒号,冒号后是这一个目标的 prerequisites(前置条件)</p> <p>紧接着新的一行,必须以一个 tab 作为开头,后面跟随 command(命令),也就是你希望这一个 target 所执行的构建命令</p>
1[target] ... : [prerequisites] ...
2<tab>[command]
3 ...
4 ...
<ul> <li>target:一个目标代表一条规则,可以是一个或多个文件名。也可以是某个操作的名字(标签),称为<strong>伪目标(phony)</strong> </li> <li>prerequisites:前置条件,这一项是<strong>可选参数</strong>。通常是多个文件名、伪目标。它的作用是 target 是否需要重新构建的标准,如果前置条件不存在或有过更新(文件的最后一次修改时间)则认为 target 需要重新构建</li> <li>command:构建这一个 target 的具体命令集</li> </ul> <h3>简单的例子</h3> <p>本文将以 <a href="https://github.com/EDDYCJY/go-gin-example" rel="nofollow noreferrer">go-gin-example</a> 去编写 Makefile 文件,请跨入 make 的大门</p> <h4>分析</h4> <p>在编写 Makefile 前,需要先分析构建先后顺序、依赖项,需要解决的问题等</p> <h4>编写</h4>
1.PHONY: build clean tool lint help
2
3all: build
4
5build:
6 go build -v .
7
8tool:
9 go tool vet . |& grep -v vendor; true
10 gofmt -w .
11
12lint:
13 golint ./...
14
15clean:
16 rm -rf go-gin-example
17 go clean -i .
18
19help:
20 @echo "make: compile packages and dependencies"
21 @echo "make tool: run specified go tool"
22 @echo "make lint: golint ./..."
23 @echo "make clean: remove object files and cached files"
<p>1、在上述文件中,使用了 <code>.PHONY</code>,其作用是声明 build / clean / tool / lint / help 为<strong>伪目标</strong>,声明为伪目标会怎么样呢?</p> <ul> <li>声明为伪目标后:在执行对应的命令时,make 就不会去检查是否存在 build / clean / tool / lint / help 其对应的文件,而是每次都会运行标签对应的命令</li> <li>若不声明:恰好存在对应的文件,则 make 将会认为 xx 文件已存在,没有重新构建的必要了</li> </ul> <p>2、这块比较简单,在命令行执行即可看见效果,实现了以下功能:</p> <ol> <li>make: make 就是 make all</li> <li>make build: 编译当前项目的包和依赖项</li> <li>make tool: 运行指定的 Go 工具集</li> <li>make lint: golint 一下</li> <li>make clean: 删除对象文件和缓存文件</li> <li>make help: help</li> </ol> <h4>为什么会打印执行的命令</h4> <p>如果你实际操作过,可能会有疑问。明明只是执行命令,为什么会打印到标准输出上了?</p> <h5>原因</h5> <p>make 默认会打印每条命令,再执行。这个行为被定义为<strong>回声</strong></p> <h5>解决</h5> <p>可以在对应命令前加上 @,可指定该命令不被打印到标准输出上</p>
<p>那么还有其他的特殊符号吗?有的,请课后去了解下 +、- 的用途 🤩</p> <h2>小结</h2> <p>这是一篇比较简洁的文章,希望可以让您对 Makefile 有一个基本了解</p> <p>恭喜你必备技能 +1</p> <h2>参考</h2> <h3>本系列示例代码</h3> <ul><li><a href="https://github.com/EDDYCJY/go-gin-example" rel="nofollow noreferrer">go-gin-example</a></li></ul> <h3>本系列目录</h3> <ul> <li><a href="https://segmentfault.com/a/1190000013297625">连载一 Golang介绍与环境安装</a></li> <li><a href="https://segmentfault.com/a/1190000013297683">连载二 搭建Blog API's(一)</a></li> <li><a href="https://segmentfault.com/a/1190000013297705">连载三 搭建Blog API's(二)</a></li> <li><a href="https://segmentfault.com/a/1190000013297747">连载四 搭建Blog API's(三)</a></li> <li><a href="https://segmentfault.com/a/1190000013297828">连载五 使用JWT进行身份校验</a></li> <li><a href="https://segmentfault.com/a/1190000013297850">连载六 编写一个简单的文件日志</a></li> <li><a href="https://segmentfault.com/a/1190000013757098">连载七 Golang优雅重启HTTP服务</a></li> <li><a href="https://segmentfault.com/a/1190000013808421">连载八 为它加上Swagger</a></li> <li><a href="https://segmentfault.com/a/1190000013960558">连载九 将Golang应用部署到Docker</a></li> <li><a href="https://segmentfault.com/a/1190000014393602">连载十 定制 GORM Callbacks</a></li> <li><a href="https://segmentfault.com/a/1190000014666453">连载十一 Cron定时任务</a></li> <li><a href="https://segmentfault.com/a/1190000015051346">连载十二 优化配置结构及实现图片上传</a></li> <li><a href="https://segmentfault.com/a/1190000015140508">连载十三 优化你的应用结构和实现Redis缓存</a></li> <li><a href="https://segmentfault.com/a/1190000015293834">连载十四 实现导出、导入 Excel</a></li> <li><a href="https://segmentfault.com/a/1190000015483482">连载十五 生成二维码、合并海报</a></li> <li><a href="https://segmentfault.com/a/1190000015558234">连载十六 在图片上绘制文字</a></li> <li><a href="https://segmentfault.com/a/1190000016236253">连载十七 用 Nginx 部署 Go 应用</a></li> <li><a href="https://segmentfault.com/a/1190000013989448">番外 Golang交叉编译</a></li> <li><a href="https://segmentfault.com/a/1190000016154678">番外 请入门 Makefile</a></li> </ul>