女主宣言

目前发现项目中的好多小伙伴在编写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相关推荐

  1. select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞

    我是个护士,四班倒,白天还好,不下雨也还好,如果遇到中班,晚上22点交班后,外面太黑了,如果在碰伤下雨天,真不知怎么好了.虽然家离工作的医院距离很近,有个500米左右,但一个人在黑暗下雨的夜晚行走,还 ...

  2. 别怕,BCH无惧攻击

    对于数字货币来说最害怕的莫过于黑客和51%攻击.前有黑客利用以太坊 ERC-20 智能合约中的漏洞攻击美链和SMT,导致其币价几乎归零.后有比特币黄金BTG和XVG遭受黑客51%攻击损失惨重.因此每当 ...

  3. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!

    摘要:在华为全联接2021期间,华为云GaussDB(for openGauss)正式推出重大内核新特性--同城双集群高可用方案,提供金融级高可用服务,支持RPO=0 .RTO<60s的同城双集 ...

  4. 无惧黑暗强光,纯视觉导航也能全天候作业

    对于一台激光导航扫地机器人而言,全天候作业并非难事,那么纯视觉导航扫地机器人能做到吗? 无论对于人,还是机器人,光线环境的变化对"眼睛"的影响都是致命的.由于视觉传感器对于光线十分 ...

  5. ArcBlock ⑪ 月报 | 无惧寒冬 ABT 2019 区块链远征启程

    1 摘要 Summary 11月,ArcBlock 区块基石(ABT)工程团队不断精进 OCAP Console.Token Flow.OCAP 服务. Forge framework 等产品服务,还 ...

  6. 双11真无线蓝牙耳机盘点分享,高音质游戏低延迟无惧卡顿

    近年来,无论是广场舞还是长跑,无论是大家庭.小情侣,阿姨还是中小学生,体育和健身在大江南北都很受欢迎,并被热情追捧.说到运动,耳机自然是不可或缺的,所以如何选择一款合适的蓝牙运动耳机已经成为许多消费者 ...

  7. 无惧车市寒冬,瓜子杨浩涌要加速“收割”市场

    中秋节前夕,车好多集团CEO杨浩涌在集团成立四周年之际发表了一封振奋人心内部信.他在内部信中表示,旗下瓜子二手车和毛豆新车两大业务的亏损均大幅收窄,预计以此二者为核心的主营业务将在今年四季度实现整体盈 ...

  8. [读书笔记][Lead Your Life]用执著、无惧、乐观的态度来引领一生

    2015-04-06 19:16:58 你,准备好了吗? 2015-04-06 19:17:47 年仅28岁的我是卡内基·梅隆大学最年轻的副教授 2015-04-06 19:27:33 开复,你是想一 ...

  9. 老手机升级鸿蒙是不是更流畅,华为称鸿蒙比安卓更能解决手机卡顿:无惧老化 36个月持续流畅...

    很多华为用户从 EMUI 升级鸿蒙之后用户发现,手机流畅度有了肉眼可见的流畅度体验. 6 月 2 日,华为鸿蒙发布会上,华为消费者业务软件部总裁王成录称,新发布的 Harmony OS 系统无惧老化, ...

最新文章

  1. Python中读取ZIP文件
  2. 在reader中勾选pdf复选框_绝对可勾选的在WORD 2003中加入复选框的方法
  3. socket编程方法,概念
  4. 用python恢复删除的文件_使用python删除N天前的文件
  5. c++各类型有效范围
  6. 多态和重载的区别及用法
  7. HTML select控件
  8. go实现文件服务器,golang文件服务器的两种方式(可以访问任何目录)
  9. 【零基础学Java】—System类(三十五)
  10. HDU 4558 剑侠情缘
  11. zynq阅读文档之通过中断读GPIO输入的编程指导
  12. moss item adding
  13. VS错误的解决办法:error LNK2019: 无法解析的外部符号
  14. 图像降噪算法——从BM3D到VBM4D
  15. 2021全国大学生信息安全竞赛初赛部分Write up
  16. R语言编程环境的安装和运行
  17. win10去掉快捷方式小箭头_win7去除快捷方式小箭头的方法教程
  18. NIVIDIA 硬解码学习2
  19. Automatic Lip-reading with Hierarchical Pyramidal Convolution and Self-Attention for Image Sequences
  20. 【回炉重造系列】之Spring AOP简介

热门文章

  1. C# 对垒 VB.NET C#不行了?
  2. 阿里淘宝天猫单点登录项目实战(附源码)
  3. Struts2中访问web元素
  4. El 表达式、jstl学习
  5. Java调用浏览器打开指定页面的5种方法(最全)
  6. 虚拟化服务器内存,服务器内存设置虚拟化
  7. mysql8.0.12url_使用最新版本MySQL8.0.12报错记录
  8. java 反射 获取方法列表_Java 反射获取类详细信息的常用方法汇总
  9. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
  10. github get 请求指定页面的代码