Golang:无惧makefile
女主宣言
目前发现项目中的好多小伙伴在编写go程序的时候,基本都是使用命令行来执行“go build”、“go test”这些命令。但是发现很是麻烦而且效率不高,所以今天小编将本文带给大家,希望能够帮助大家提高效率。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
在平时的开发过程中,总是习惯于手动的去反复执行“go build”、“go test”这些命令。如果没有参数的话,感觉还好。但是如果在复杂的任务中,这将会变的非常的痛苦。而且这并不是一个好的习惯。对于这个问题,你可能会有一些其他的方式来解决,比如可以写一个shell脚本来执行。但是对于我来讲,写一个makefile才是一个更好的选择。在makefile里面,我们可以把所有的任务都整合在一起。在本篇文章中,我会将makefile整合到我的项目中。
# Go parameters
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
BINARY_NAME=mybinary
BINARY_UNIX=$(BINARY_NAME)_unix
all: test build
build:
$(GOBUILD) -o $(BINARY_NAME) -v
test:
$(GOTEST) -v ./...
clean: $(GOCLEAN) rm -f $(BINARY_NAME) rm -f $(BINARY_UNIX)
run: $(GOBUILD) -o $(BINARY_NAME) -v ./... ./$(BINARY_NAME)
deps: $(GOGET) github.com/markbates/goth
$(GOGET) github.com/markbates/pop
# Cross compilation
build-linux: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_UNIX) -v
docker-build: docker run --rm -it -v "$(GOPATH)":/go -w /go/src/bitbucket.org/rsohlich/makepost golang:latest go build -o "$(BINARY_UNIX)" -v
假设我喜欢保持ERY规则的概念。因此,在文件的顶部声明常用的命令和变量是很方便的。并在文件中进一步引用它们。
# Basic go commands
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
# Binary names
BINARY_NAME=mybinary
BINARY_UNIX=$(BINARY_NAME)_unix
makefile目标被定义为标签 “:” 之后。如果给出的参数是给定的,则由make工具执行。如果没有指定参数,则默认执行第一个任务。在本例中将执行“all”任务。
> make run // call specific task
> make // make tool calls "all" task
1
基础命令
makefile的一个重要部分是构建步骤。使用变量$(GOBUILD)执行“go build”命令。程序名是由“-o $(BINARY_NAME)”定义的,而且使用“-v”切换到详细模式也很有用。使用详细模式,可以看到当前构建的包。
build:
$(GOBUILD) -o $(BINARY_NAME) -v // expands to: "go build -o mybinary -v"
因为我们可以比较懒,所以目标在“run”这儿。目标构建生成程序并且接着运行它。
run: $(GOBUILD) -o $(BINARY_NAME) -v ./... ./$(BINARY_NAME)
当然,测试命令也应该是项目makefile的一部分。我个人更倾向于选择详细模式,以便能够调试并更好地观察测试运行。
test:
$(GOTEST) -v ./...
如果项目使用的是CI/CD,或者只是为了一致性,最好保留包中使用的依赖项列表。这是由“deps”任务完成的,该任务应该通过“go get”命令获得所有必要的依赖项。
deps: $(GOGET) github.com/markbates/goth $(GOGET) github.com/markbates/pop
为了将这部分有用的命令封装起来,clean命令会被包含到makefile中。
在$(BINARY_XXX)变量中添加了“rm -f”命令以删除带有自定义名称的二进制文件。通常,另一个清理命令可能是这个部分的一部分。
clean: $(GOCLEAN) rm -f $(BINARY_NAME) rm -f $(BINARY_UNIX)
2
跨编译器命令
如果项目的目的是在另一个平台上运行,而不是在开发的平台上运行,那么可以使用交叉编译命令来创建文件。我通常在容器中运行Linux平台上的二进制文件,因此makefile包含了Linux构建。
build-linux: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_UNIX) -v
如果你的代码使用C绑定,你可能会遇到一些问题。CGO的问题在于,你需要一个兼容给定平台的gcc。因此,如果在osx/windows上进行开发,你需要构建gcc来为Linux编译。至少对我来说,在OSX上编译C代码并不是那么简单的。如果需要CGO,那么docker映像是创建Linux构建的最佳方式。唯一的要求是:必须安装Docker。
docker-build: docker run --rm -it -v "$(GOPATH)":/go -w /go/src/bitbucket.org/rsohlich/makepost golang:latest go build -o "$(BINARY_UNIX)" -v
总结
通过这种方式,可以使你的开发过程更加有效和流畅。如果有什么疑问,不要犹豫发表评论或提问,我们很乐意回答或探讨。Enjoy!
扫描下方二维码了解更多内容
Golang:无惧makefile相关推荐
- select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞
我是个护士,四班倒,白天还好,不下雨也还好,如果遇到中班,晚上22点交班后,外面太黑了,如果在碰伤下雨天,真不知怎么好了.虽然家离工作的医院距离很近,有个500米左右,但一个人在黑暗下雨的夜晚行走,还 ...
- 别怕,BCH无惧攻击
对于数字货币来说最害怕的莫过于黑客和51%攻击.前有黑客利用以太坊 ERC-20 智能合约中的漏洞攻击美链和SMT,导致其币价几乎归零.后有比特币黄金BTG和XVG遭受黑客51%攻击损失惨重.因此每当 ...
- 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!
摘要:在华为全联接2021期间,华为云GaussDB(for openGauss)正式推出重大内核新特性--同城双集群高可用方案,提供金融级高可用服务,支持RPO=0 .RTO<60s的同城双集 ...
- 无惧黑暗强光,纯视觉导航也能全天候作业
对于一台激光导航扫地机器人而言,全天候作业并非难事,那么纯视觉导航扫地机器人能做到吗? 无论对于人,还是机器人,光线环境的变化对"眼睛"的影响都是致命的.由于视觉传感器对于光线十分 ...
- ArcBlock ⑪ 月报 | 无惧寒冬 ABT 2019 区块链远征启程
1 摘要 Summary 11月,ArcBlock 区块基石(ABT)工程团队不断精进 OCAP Console.Token Flow.OCAP 服务. Forge framework 等产品服务,还 ...
- 双11真无线蓝牙耳机盘点分享,高音质游戏低延迟无惧卡顿
近年来,无论是广场舞还是长跑,无论是大家庭.小情侣,阿姨还是中小学生,体育和健身在大江南北都很受欢迎,并被热情追捧.说到运动,耳机自然是不可或缺的,所以如何选择一款合适的蓝牙运动耳机已经成为许多消费者 ...
- 无惧车市寒冬,瓜子杨浩涌要加速“收割”市场
中秋节前夕,车好多集团CEO杨浩涌在集团成立四周年之际发表了一封振奋人心内部信.他在内部信中表示,旗下瓜子二手车和毛豆新车两大业务的亏损均大幅收窄,预计以此二者为核心的主营业务将在今年四季度实现整体盈 ...
- [读书笔记][Lead Your Life]用执著、无惧、乐观的态度来引领一生
2015-04-06 19:16:58 你,准备好了吗? 2015-04-06 19:17:47 年仅28岁的我是卡内基·梅隆大学最年轻的副教授 2015-04-06 19:27:33 开复,你是想一 ...
- 老手机升级鸿蒙是不是更流畅,华为称鸿蒙比安卓更能解决手机卡顿:无惧老化 36个月持续流畅...
很多华为用户从 EMUI 升级鸿蒙之后用户发现,手机流畅度有了肉眼可见的流畅度体验. 6 月 2 日,华为鸿蒙发布会上,华为消费者业务软件部总裁王成录称,新发布的 Harmony OS 系统无惧老化, ...
最新文章
- Python中读取ZIP文件
- 在reader中勾选pdf复选框_绝对可勾选的在WORD 2003中加入复选框的方法
- socket编程方法,概念
- 用python恢复删除的文件_使用python删除N天前的文件
- c++各类型有效范围
- 多态和重载的区别及用法
- HTML select控件
- go实现文件服务器,golang文件服务器的两种方式(可以访问任何目录)
- 【零基础学Java】—System类(三十五)
- HDU 4558 剑侠情缘
- zynq阅读文档之通过中断读GPIO输入的编程指导
- moss item adding
- VS错误的解决办法:error LNK2019: 无法解析的外部符号
- 图像降噪算法——从BM3D到VBM4D
- 2021全国大学生信息安全竞赛初赛部分Write up
- R语言编程环境的安装和运行
- win10去掉快捷方式小箭头_win7去除快捷方式小箭头的方法教程
- NIVIDIA 硬解码学习2
- Automatic Lip-reading with Hierarchical Pyramidal Convolution and Self-Attention for Image Sequences
- 【回炉重造系列】之Spring AOP简介
热门文章
- C# 对垒 VB.NET C#不行了?
- 阿里淘宝天猫单点登录项目实战(附源码)
- Struts2中访问web元素
- El 表达式、jstl学习
- Java调用浏览器打开指定页面的5种方法(最全)
- 虚拟化服务器内存,服务器内存设置虚拟化
- mysql8.0.12url_使用最新版本MySQL8.0.12报错记录
- java 反射 获取方法列表_Java 反射获取类详细信息的常用方法汇总
- java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
- github get 请求指定页面的代码