golang项目之Makefile
01
介绍
Go 提供一个名为go的命令,该命令可自动下载、构建、安装和测试 Go 包和命令。
Go 提供go命令,官方的目的是为了不需要编写 Makefile,而是能够仅使用 Go 源代码本身中的信息来构建 Go 代码。
但是,我们在 Go 项目中也不需要完全摒弃使用 make 和 Makefile,可以使用 Makefile 的“伪目标”,简化使用 go 命令的复杂性,规范团队使用 go 命令的方式,提升个人或团队的生产力。
02
make 和 Makefile
make 命令行工具可以自动判断是否需要重新编译程序,实际上 make 不仅限于程序,我们可以使用它来描述任何任务,只要其他文件发生更改,某些文件就必须从其他文件自动更新。
在使用 make 命令行工具之前,我们需要编写一个名为 Makefile 的文件,该文件描述程序中文件之前的关系,并提供用于更新每个文件的命令。也就是说 Makefile 决定 make 做什么。
关于 Makefile 的介绍,感兴趣的读者朋友,可以查阅相关资料深入学习,本文仅介绍 Makefile 的规则(格式),如下所示:
target ... : prerequisites ...
<Tab>command
...
...
或
target ... : prerequisites ...;command
阅读上面示例代码,target 是目标文件,多个目标文件之间使用空格分隔,一般只有一个目标文件,也可以是“伪目标”(某个操作的名字);prerequisites 是先决条件;command 是“命令”,可以在 prerequisites 后面,使用分号分隔,也可以另起一行,但是必须以<Tab>开头,如果想要使用其他键,可以使用内置变量 .RECIPEPREFIX 声明。
target 目标是必须的,不可省略。prerequisites 和 command 是可选的,但是二者必须存在其一。
03
Go 项目使用 Makefile
在 Go 项目中使用 Makefile,一般我们只会使用“伪目标”,我们使用 go build 构建可执行文件为例,介绍 Go 项目怎么使用 Makefile。
示例代码:
build:
go build -o blog
阅读上面示例代码,我们编写一个简单的 Makefile,定义一个“伪目标” build,命令是 go build -o blog,构建名为 blog 的可执行文件。
使用 make 命令行工具,运行“伪目标”build。
make build
运行 make build,终端打印出 Makefile 中“伪目标” build 的命令。
go build -o blog
如果我们不想打印出执行的命令,可以在命令前面加上 @ 符号。
在实际项目开发时,我们可能需要构建多个操作系统的可执行文件,我们再编写一个 Makefile,新增三个“伪目标”,分别是windows、linux 和 darwin。
示例代码:
APP=blog
build:
@go build -o ${APP}
windows:
@GOOS=windows go build -o ${APP}-windows
linux:
@GOOS=linux go build -o ${APP}-linux
darwin:
@GOOS=darwin go build -o ${APP}-darwin
阅读上面示例代码,我们定义一个自定义变量 APP,在命令行中使用 $(APP) 调用变量,并且 GOOS 指定操作系统,使用@开头,不再打印执行命令。
运行 make windows、make linux 和 make darwin,分别构建 windows、linux 和 drawin 操作系统的可执行文件。
运行结果如下:
.
├── Makefile
├── blog
├── blog-darwin
├── blog-linux
├── blog-windows
├── go.mod
└── main.go
需要注意的是,如果有文件名和“伪目标”同名,那么该“伪目标”无法使用 make 命令执行指定的 command。因为 make 发现与“伪目标”同名的文件已存在,将不会再重新构建,所以就不会运行指定的 command,为了避免出现该问题,可以使用内置目标名.PHONY声明这些“伪目标”名是“伪目标”,而不是与“伪目标”同名的文件。
完整 Makefile 文件:
APP=blog
.PHONY: help all build windows linux darwin
help:
@echo "usage: make <option>"
@echo "options and effects:"
@echo " help : Show help"
@echo " all : Build multiple binary of this project"
@echo " build : Build the binary of this project for current platform"
@echo " windows: Build the windows binary of this project"
@echo " linux : Build the linux binary of this project"
@echo " darwin : Build the darwin binary of this project"
all:build windows linux darwin
build:
@go build -o ${APP}
windows:
@GOOS=windows go build -o ${APP}-windows
linux:
@GOOS=linux go build -o ${APP}-linux
darwin:
@GOOS=darwin go build -o ${APP}-darwin
阅读上面示例代码,我们可以看到 Makefile 中第二个“伪目标” all,该目标只有 4 个先决条件,没有任何命令。执行 make all 命令,可以批量执行多个“伪目标”。该命令等同于以下命令:
make build
make windows
make linux
make darwin
细心的读者朋友们阅读到此处,心中可能会有一个疑问,想要知道 Makefile 中包含哪些“目标”,必须查看 Makefile 文件吗?
不必如此,我们可以在 Makefile 中编写一个“伪目标” help,用于描述 Makefile 中的“伪目标”列表和使用示例等。
Make 命令运行时,如果不指定“目标”,默认执行 Makefile 文件的第一个“目标”。一般将 help 作为 Makefile 的第一个“伪目标”,我们可以执行 make 或 make help 命令,输出使用方法。
golang项目:
对于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=`go list ./... | grep -v /vendor/`
VETPACKAGES=`go list ./... | grep -v /vendor/ | grep -v /examples/`
GOFILES=`find . -name "*.go" -type f -not -path "./vendor/*"` default:
@go build -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 "Please run 'make fmt' and commit the result:"; \
echo "$${diff}"; \
exit 1; \
fi; install:
@govendor sync -v test:
@go test -cpu=1,2,4 -v -tags integration ./... vet:
@go vet $(VETPACKAGES) docker:
@docker build -t wuxiaoxiaoshen/example:latest . clean:
@if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi .PHONY: default fmt fmt-check install test vet docker clean
windows下安装make
# 安装choco使用该软件工具进行make安装 # 1.管理员身份打开powershell,执行命令
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) # 2.安装make
choco install make 安装完成后, 例如路径: C:\ProgramData\chocolatey\bin\make.exe
需要将该路径在goland中添加 Build Tools > Make中进行配置

注意点:
1.文件的命令行前面必须是tab, 否则会出现各种奇奇怪怪的报错,建议下载插件进行文件校验
Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop.
2.在windows系统下进行交叉编译的时候,跟linux下设置环境变量有些不同
set GOOS=windows; set GOARCH=amd64; go build -v -ldflags "-w -s" -o golang-demo_windows.exe ./cmd/app/main.go
#说明
使用set进行设置
使用分号设置多个
参考:
golang项目之Makefile的更多相关文章
- Golang项目目录结构组织
其实golang的工程管理还是挺简单的,完全使用目录结构还有package名来推导工程结构和构建顺序. 当然,首先要说的是环境变量$GOPATH,项目构建全靠它.这么说吧,想要构建一个项目,就要将这个 ...
- golang项目中使用条件编译
golang项目中使用条件编译 C语言中的条件编译 golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和de ...
- Emacs中多个golang项目的配置方法
概述 最近使用golang开发项目时, 发现有时需要同时进行多个golang项目. 在这种情况下, 如果把所有的项目都放在 GOPATH 之下, 不仅管理麻烦(因为各个项目需要提交到不同的代码库), ...
- 关于go get安装git golang项目时报错的处理办法
关于go get安装git golang项目时报错的处理办法 使用go get安装github上的项目时一般来说,不可避免会出错.各种错误的处理办法: 必须条件: 1.安装git并配置环境变量.下载地 ...
- Golang项目的测试实践
Golang项目的测试实践 最近有一个项目,链路涉及了4个服务.最核心的是一个配时服务.要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点.这篇就说下最近这个实践的过程总结. 测试金字塔 ...
- 为Go项目编写Makefile
为Go项目编写Makefile 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程. make介绍 make是一个构建自动化工具,会在当前目录下寻 ...
- Golang项目的配置管理——Viper简易入门配置
Golang项目的配置管理--Viper简易入门配置 What is Viper? From:https://github.com/spf13/viper Viper is a complete co ...
- LibOpenCM3(二) 项目模板 Makefile分析
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3 项目模板 项目模板地址: https://githu ...
- 使用 SmartIDE 开发golang项目
目录 概述 架构 开发视图 快速开始 安装 SmartIDE CLI 环境 启动 创建环境 安装工具 调试 基本调试 Start 命令调试 很荣幸在去年加入到 SmartIDE 产品组,从事开发工作, ...
- golang 项目实战简明指南
原文地址 开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 go build 就能将源码编译成对应平台(本文中默认为 linux)上的可执行 ...
随机推荐
- SQL 求中位值
题目A median is defined as a number separating the higher half of a data set from the lower half. Quer ...
- C语言实现一个走迷宫小游戏(深度优先算法)
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C++的语法(使用Dev-C++并且文件扩展名为.cpp的没有影响),如果有的朋友使用的语言标准是VC6的话可能不支持,所以在修改过后再上传一版, ...
- Vert.x HttpClient调用后端服务时使用Idle Timeout和KeepAlive Timeout的行为分析
其实网上有大量讨论HTTP长连接的文章,而且Idle Timeout和KeepAlive Timeout都是HTTP协议上的事情,跟Vert.x本身没有太大关系,只不过最近在项目上遇到了一些问题,用到 ...
- .NET 8 + Vue/UniApp 高性能前后端分离框架
前言 作为一名开发者,我们知道能够简化开发流程.提升工作效率的工具是至关重要的. 推荐一款前后端分离框架 Admin.NET(ZRAdmin),它不仅可以满足项目开发的需求,还应用了一些新的特性,如R ...
- 这才是批量update的正确姿势!
前言 最近我有位小伙伴问我,在实际工作中,批量更新的代码要怎么写. 这个问题挺有代表性的,今天拿出来给大家一起分享一下,希望对你会有所帮助. 1 案发现场 有一天上午,在我的知识星球群里,有位小伙伴问 ...
- IP地址集中管控:从分配规划、现网管理到合规性监测、准入控制全周期监管
当前,网络已成为企业必不可少的资源,企业网络系统也在不断扩展,IP地址数量不断增长,随之而来的是IP地址管理问题凸显.如何高效集中地管理网络中的IP地址,IP如何有效划分,成为影响企业网络可用性和质量 ...
- laravel框架接口
下面是增删改查的接口,在使用过程中按自己需求对代码进行更改 控制器代码 <?php namespace App\Http\Controllers; use App\Models\Fang; us ...
- linux那些事之页迁移(page migratiom)
Page migration 页迁移技术是内核中内存管理的一种比较重要的技术,最早该技术诞生于NUMA系统中(Page migration [LWN.net]),后续由于内存规整以及CMA和COW技术 ...
- 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊
本文为大家整理了墨天轮数据社区2024年7月发布的优质技术文章/文档,主题涵盖Oracle.MySQL.PostgreSQL等主流数据库系统以及国产数据库的深度教程和实用指南.从基础的安装配置到复杂的 ...
- 数据库小白看这里,这个Oracle数据库知识图谱你值得拥有(含MySQL、PG图谱)
2022年前后,墨天轮社区曾陆续推出PostgreSQL知识图谱.MySQL知识图谱,并得到了大家的广泛好评.此后,便有众多朋友对Oracle知识图谱发起不断"催更".经过近期的内 ...