0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何编写适用于Go项目的Makefile

Linux爱好者 来源:稀土掘金 作者:谢伟 2022-03-16 10:45 次阅读

【导读】本文是一篇 Go 项目的 Makefile 指南。

本文章的主题是: 编写适用于 Go 项目的 Makefile 指南。

1. 前提:

  • 会使用 Makefile
  • 会使用 Go 编写项目

编写项目的过程中,经常需要对文件进行编译和执行,查看功能开发或者修复的 Bug 是否正确。你当然可以直接执行 go build 命令用来编译,执行 go run

命令来执行。

在编写 Go 项目其实还会经常执行些诸如 测试、格式检查、库下载安装等命令。

当然你也可以编写 shell 脚本来执行这些命令,进一步进行了简化。

其实有更好的选择,即 Makefile。在诸多的开源项目中经常能看到 Makefile 的身影。当你的项目中文件发生变化,都可以使用 Makefile 执行命令来自动构建

2. Makefile 语法

PROJECT="example"

default:
echo${PROJECT}

install:
@govendorsync-v

test:install
@gotest./...

.PHONY:defaultinstalltest



上文是一个非常简单的 Makefile 文件,通过这些命令的编写,直接执行 make , make install, make test 等就能完成对应的命令。

格式介绍:

:
[tab]

  • target : 即自定义的想要执行的命令
  • prerequisites: 前置条件,即执行 target 命令之前执行的命令
  • commands : 具体的执行的命令
  • .PHONY 伪指令,内置的关键字
  • 不带参数,默认执行第一个 target
  • @ 表示禁止回声,即终端不会打印真实的执行命令
  • # 表示注释
  • ${val} 表示变量,和 shell 脚本中的变量的声明和使用一致
  • 允许使用 通配符

3. Go 项目

Go 中支持内置的 go 命令,可以用来执行:测试、编译、运行、语法检查等命令

一个完善的 Go 项目经常会执行哪些命令?

  • go vet 静态检查
  • go test 运行单元测试
  • go fmt 格式化
  • go build 编译
  • go run 运行...

所以一个适用于 Go 项目的 Makefile 也应该支持这些命令。

  • make default : 编译
  • make fmt: 格式化
  • make vet: 静态检查
  • make test: 运行测试
  • make install: 下载依赖库
  • make clean: 移除编译的二进制文件

所以整体可以如下安排:

BINARY="example"
VERSION=1.0.0
BUILD=`date+%FT%T%z`

PACKAGES=`golist./...|grep-v/vendor/`
VETPACKAGES=`golist./...|grep-v/vendor/|grep-v/examples/`
GOFILES=`find.-name"*.go"-typef-not-path"./vendor/*"`

default:
@gobuild-o${BINARY}-tags=jsoniter

list:
@echo${PACKAGES}
@echo${VETPACKAGES}
@echo${GOFILES}

fmt:
@gofmt-s-w${GOFILES}

fmt-check:
@diff=?(gofmt-s-d$(GOFILES));
if[-n"$$diff"];then
echo"Pleaserun'makefmt'andcommittheresult:";
echo"$${diff}";
exit1;
fi;

install:
@govendorsync-v

test:
@gotest-cpu=1,2,4-v-tagsintegration./...

vet:
@govet$(VETPACKAGES)

docker:
@dockerbuild-twuxiaoxiaoshen/example:latest.

clean:
@if[-f${BINARY}];thenrm${BINARY};fi

.PHONY:defaultfmtfmt-checkinstalltestvetdockerclean



4. 补充

Makefile 构建工具,大大的简化了构建项目的难度。

真实的生产环境下,需要使用到CI/CD(持续集成和持续部署), 所以 Makefile 也通常用来和 CI 工具配合使用。

比如新合并的代码,先触发单元测试,静态检查等,在执行 CI 脚本,成功之后,再构建镜像,推送镜像到服务器上,完成持续集成和持续部署一整套流程。

Makefile 通常配合 travis 使用。

比如:

language:go
go:
-"1.11"
-"1.11.x"
env:
-GO111MODULE=on
notifications:
email:
recipients:
-wuxiaoshen@shu.edu.cn
on_success:change#default:change
on_failure:always#default:always

before_install:
-gotest-cpu=1,2,4-v-tagsintegration./...
-govet$(golist./...|grep-v/vendor/)

script:
-makefmt
-makefmt-check
-makevet
-makelist
-gotest-race./...-coverprofile=coverage.txt-covermode=atomic

希望对大家有所启发。

原文标题:适用于 Go 项目的 Makefile 指南

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编写
    +关注

    关注

    0

    文章

    29

    浏览量

    8442
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    19181
  • BUG
    BUG
    +关注

    关注

    0

    文章

    155

    浏览量

    15665

原文标题:适用于 Go 项目的 Makefile 指南

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    说说适用于单片机的接口适配器模式的实现

    不带操作系统的情况下,想要整个框架易于移植,易于理解,那么我们真的需要好好想想这个设计模式怎么写了。下面我根据自己的项目经验,来说说适用于单片机的接口适配器模式的实现。大佬勿扰,多多指教。一般实现在我们做项目的时候,一般的实现,
    发表于 11-10 06:04

    使用go实现一个适用于嵌入式上的存储模块

    接着上一篇的继续,使用go实现一个适用于嵌入式上的存储模块。简单易用,使用简单方便。由于在终端上,不需要执行复杂的sql查询,多表级联查询等。就是用来存储记录的,因此设计为存储到表里的都为二进制
    发表于 12-20 06:10

    makefile文件的编写方式

    arm-none-eabi- 在 Makefile 中的应用过程,对比于嵌入式可视编译器 keil_v5 有什么共同点,编译思维是怎样的,并完成一个简单项目的Makefile编写
    发表于 02-07 06:47

    适用于所有atmega328p项目的通用板

    描述适用于所有 atmega328p 项目的通用板这个项目在我们的现实世界中有很多用途,它用于水位控制器,基于gsm的项目,7段接口,远程控
    发表于 08-29 07:43

    USB标准适用于哪些应用

    USB标准适用于哪些应用 通用串行总线 (USB) 外设接口已广泛应用于所有个人计算平台及众多工业和基础设施平台。不过,与此同时,人们对适用于
    发表于 04-19 14:31 1807次阅读

    如何写Makefile编译汇编和C文件

    经常在一个项目中包含多个.c源文件,而且一个.c源文件包含了一堆的头文件,这种情况下如何编写makefile,使得能成功编译整个项目?本博文对这些问题提出自己浅析的理解。涉及到对gcc
    发表于 11-24 09:03 1.4w次阅读
    如何写<b class='flag-5'>Makefile</b>编译汇编和C文件

    Makefile项目模板免费下载

    本文档的主要内容详细介绍的是Makefile项目模板免费下载 可根据项目名称修改。
    发表于 06-12 08:00 11次下载
    <b class='flag-5'>Makefile</b>的<b class='flag-5'>项目</b>模板免费下载

    适用于恶劣环境的产品

    适用于恶劣环境的产品
    发表于 05-27 20:30 9次下载
    <b class='flag-5'>适用于</b>恶劣环境的产品

    Go项目中引入中间件的目的和效果如何

    中间件是什么?Go 项目中引入中间件的目的和效果如何?本文详细介绍了Golang 中间件。 中间件是一种计算机 软件,可为 操作系统 提供的 软件应用程序 提供服务,以便于各个软件之间的沟通,特别是
    的头像 发表于 08-14 14:24 2030次阅读

    适用于MCU项目的代码框架BabyOS

    关注、星标公众号,不错过精彩内容来源:码云+嵌入式云IOT技术圈一个好的代码架构直接影响项目的质量,今天为大家分享的是一个管理功能模块和外设驱动的框架:BabyOS.BabyOS是什么?...
    发表于 10-25 12:51 3次下载
    <b class='flag-5'>适用于</b>MCU<b class='flag-5'>项目的</b>代码框架BabyOS

    交叉编译链下的Makefile(STM32F4xx)

    arm-none-eabi- 在 Makefile 中的应用过程,对比于嵌入式可视编译器 keil_v5 有什么共同点,编译思维是怎样的,并完成一个简单项目的Makefile编写
    发表于 12-04 12:36 7次下载
    交叉编译链下的<b class='flag-5'>Makefile</b>(STM32F4xx)

    适用于所有atmega328p项目的通用板

    电子发烧友网站提供《适用于所有atmega328p项目的通用板.zip》资料免费下载
    发表于 08-03 09:45 8次下载
    <b class='flag-5'>适用于</b>所有atmega328p<b class='flag-5'>项目的</b>通用板

    适用于ArduiNOOBS的MAX7219 LED矩阵模块项目

    电子发烧友网站提供《适用于ArduiNOOBS的MAX7219 LED矩阵模块项目.zip》资料免费下载
    发表于 10-19 14:29 0次下载
    <b class='flag-5'>适用于</b>ArduiNOOBS的MAX7219 LED矩阵模块<b class='flag-5'>项目</b>

    Go开源13周年 2022发布更多改变的Go 1.18 和 Go 1.19版本

    还有 Go 工作区、模糊测试等重要功能。 泛型是社区呼声最大的特性,也是今年 Go 最重大的特性,它为 Go 添加了参数多态性,以允许编写适用于
    的头像 发表于 11-17 16:37 1230次阅读

    适用于Windows 10 IoT Core的Adafruit入门包创建开源项目

    电子发烧友网站提供《适用于Windows 10 IoT Core的Adafruit入门包创建开源项目.zip》资料免费下载
    发表于 12-29 11:08 0次下载
    <b class='flag-5'>适用于</b>Windows 10 IoT Core的Adafruit入门包创建开源<b class='flag-5'>项目</b>