首页 > 其他分享 >使用makefile帮助GO项目开发

使用makefile帮助GO项目开发

时间:2025-01-02 23:18:58浏览次数:1  
标签:帮助 CODE COLOR makefile test build coverage GO DIR

使用makefile可以快捷管理和构建自己的go项目, 适用于linux远程开发等环境.

提供一个基础的makefile供开发使用.

大部分是针对常用指令的二次封装

Makefile

先展示文件内容, 之后讲解具体指令功能和实现

# -------------------------------------------------------------------------------
# Makefile for go project
# -------------------------------------------------------------------------------

# -------------------------------------------------------------------------------
# variables
# -------------------------------------------------------------------------------
MAIN_FILE := main.go

BIN_DIR := ./bin
APP := main # the name of the application

# the name of the docker image
# DOCKER_IMAGE_NAME := docker-image-name-example

# args
STATIC_ARGS := -ldflags='-extldflags "-static"'
RACE_ARGS := -race

# this dir is for the test output when u run `test` cmd
TEST_OUTPUT_DIR := ./test_output

# color code
GREEN_COLOR_CODE_HEAD := \033[32m
GREEN_COLOR_CODE_END := \033[0m
RED_COLOR_CODE_HEAD := \033[31m
RED_COLOR_CODE_END := \033[0m

# -------------------------------------------------------------------------------
# commands
# -------------------------------------------------------------------------------

# build the application
.PHONY: build
build:
	go build -o $(BIN_DIR)/$(APP) $(MAIN_FILE)

# build the application statically
# you can use this if you want to run the application on a system without a C compiler
# if you use glibc, you can also use the static version of glibc(like musl)
.PHONY: build-static
build-static:
	go build $(STATIC_ARGS) -o $(BIN_DIR)/$(APP) $(MAIN_FILE)

# build the application with docker
# u need to set the DOCKER_IMAGE_NAME variable
.PHONY: build-docker
build-docker:
	docker build -t $(DOCKER_IMAGE_NAME) .
	@$(show_info)"Docker image built successfully: $(GREEN_COLOR_CODE_HEAD)$(DOCKER_IMAGE_NAME)$(GREEN_COLOR_CODE_END)";

# run the application with race detector
# use this cmd when u develop
.PHONY: run
run:
	go run $(RACE_ARGS) $(MAIN_FILE)

# test application
# it will create a coverage.out file(for test coverage)
.PHONY: test
test:
	mkdir -p $(TEST_OUTPUT_DIR)
	go test -v -covermode=set -coverprofile=$(TEST_OUTPUT_DIR)/coverage.out ./...

# show the test coverage
# it will create a coverage.html file from coverage.out
# so, u need to run `test` cmd first
.PHONY: test-coverage
test-coverage: test
	go tool cover -html=$(TEST_OUTPUT_DIR)/coverage.out -o $(TEST_OUTPUT_DIR)/coverage.html
	@$(show_info)"Please open $(GREEN_COLOR_CODE_HEAD)$(TEST_OUTPUT_DIR)/coverage.html$(GREEN_COLOR_CODE_END) to see the test coverage"

# clean the application
# it will remove the bin directory and the test output directory
.PHONY: clean
clean:
	go clean
	rm -rf $(BIN_DIR) $(TEST_OUTPUT_DIR)

# -------------------------------------------------------------------------------
# functions
# -------------------------------------------------------------------------------

# echo time
TIMESTAMP_FORMAT := %Y-%m-%d %H:%M:%S
define timestamp
	$(shell date "+$(TIMESTAMP_FORMAT)")
endef

# show info
INFO_PREFIX := *INFO
define show_info
	@echo -e "$(GREEN_COLOR_CODE_HEAD)$(INFO_PREFIX):$(GREEN_COLOR_CODE_END)"
	@echo -e $(1)
endef

# show error
# it will exit the program
ERROR_PREFIX := *ERROR
define show_error
	@echo -e "$(RED_COLOR_CODE_HEAD)$(ERROR_PREFIX):$(RED_COLOR_CODE_END)"
	@echo -e $(1)
	exit 1
endef
  • build: 基本构建指令, 最简单的编译二级制可执行文件的指令.
  • build-static: 编译静态文件
  • build-docker: 打包docker image
  • run: 开发中测试代码
  • test: 运行单元测试
  • test-coverage: 使用HTML的方式展示单元测试的覆盖率
  • clean: 清理

build

# build the application
.PHONY: build
build:
	go build -o $(BIN_DIR)/$(APP) $(MAIN_FILE)

最基础的go的编译运行的方式

  • 编译出来的可执行文件在bin目录下

build-static

# build the application statically
# you can use this if you want to run the application on a system without a C compiler
# if you use glibc, you can also use the static version of glibc(like musl)
.PHONY: build-static
build-static:
	go build $(STATIC_ARGS) -o $(BIN_DIR)/$(APP) $(MAIN_FILE)

GO默认编译出来的就是静态的文件, 但是可能需要依赖C的库, 为了进一步的静态编译, 可以使用这个指令

在设置网络编程的时候, 可能存在glibc库无法编译进去, 可以使用musl版本的

build-docker

# build the application with docker
# u need to set the DOCKER_IMAGE_NAME variable
.PHONY: build-docker
build-docker:
	docker build -t $(DOCKER_IMAGE_NAME) .
	@$(show_info)"Docker image built successfully: $(GREEN_COLOR_CODE_HEAD)$(DOCKER_IMAGE_NAME)$(GREEN_COLOR_CODE_END)";

打包docker image, 需要自己在当前目录编写好dockerfile

  • 需要自己设置好DOCKER_IMAGE_NAME配置的名字

运行成功之后会输出Docker image built successfully: XXX

run

# run the application with race detector
# use this cmd when u develop
.PHONY: run
run:
	go run $(RACE_ARGS) $(MAIN_FILE)

在dev的时候运行程序, 带上-race检查竞态

它可以帮助开发者检测并发程序中的数据竞争问题。数据竞争是指多个goroutine同时访问共享内存,并且至少有一个访问是写操作,而没有使用同步机制来保护共享数据,这会导致程序的行为变得不可预测,甚至崩溃。

test

# test application
# it will create a coverage.out file(for test coverage)
.PHONY: test
test:
	mkdir -p $(TEST_OUTPUT_DIR)
	go test -v -covermode=set -coverprofile=$(TEST_OUTPUT_DIR)/coverage.out ./...

执行单元测试

会创建一个用于单元测试输出的文件夹

输出的coverage.out文件说明了单元测试的覆盖率情况, 这一般使用百分比表示

效果:

.
└── test_output
    ├── coverage.html
    └── coverage.out

test-coverage

# show the test coverage
# it will create a coverage.html file from coverage.out
# so, u need to run `test` cmd first
.PHONY: test-coverage
test-coverage: test
	go tool cover -html=$(TEST_OUTPUT_DIR)/coverage.out -o $(TEST_OUTPUT_DIR)/coverage.html
	@$(show_info)"Please open $(GREEN_COLOR_CODE_HEAD)$(TEST_OUTPUT_DIR)/coverage.html$(GREEN_COLOR_CODE_END) to see the test coverage"

生成展示单元测试覆盖情况的HTML文件

可以在浏览器中打开并且查看效果

clean

# clean the application
# it will remove the bin directory and the test output directory
.PHONY: clean
clean:
	go clean
	rm -rf $(BIN_DIR) $(TEST_OUTPUT_DIR)

清除文件

包含GO的编译文件和test输出文件

函数

# show info
INFO_PREFIX := *INFO
define show_info
	@echo -e "$(GREEN_COLOR_CODE_HEAD)$(INFO_PREFIX):$(GREEN_COLOR_CODE_END)"
	@echo -e $(1)
endef

# show error
# it will exit the program
ERROR_PREFIX := *ERROR
define show_error
	@echo -e "$(RED_COLOR_CODE_HEAD)$(ERROR_PREFIX):$(RED_COLOR_CODE_END)"
	@echo -e $(1)
	exit 1
endef

一些函数帮助格式化输出一些tips内容

  • 打印error message的时候会直接使用exit 1退出, 因为出现了错误

标签:帮助,CODE,COLOR,makefile,test,build,coverage,GO,DIR
From: https://www.cnblogs.com/xuhe2/p/18648911

相关文章

  • Redis,MongoDB,MySQL,ES之间的区别与适用场景
    Redis,MongoDB,MySQL,ES之间的区别与适用场景:redis是一种高性能键值存储数据库,基于内存操作,支持数据持久化,支持数据类型丰富(如:字符串,哈希,列表,集合,有序集合等),redis还提供了订阅/发布,事务,lua脚本,主从同步等功能,适用于访问频繁,数据量较小,对性能要求比较高的业务场景,如缓存,队列,计数......
  • django常用组件
    Django-cronDjango-cron可以定期运行Django/Python代码,提供跟踪和执行任务的基本管道,大多数人最常用的两种方式是编写自定义Python脚本或每个cron的管理命令。除此之外,通常还需要一些跟踪成功,失败等的机制。安装使用pip安装,最好安装在虚拟环境中添加django_cron到你的Dj......
  • Netlogon Remote Protocol (NRPC) 是 Microsoft Windows 操作系统中用于支持 Netlogon
    NetlogonRemoteProtocol(NRPC)是MicrosoftWindows操作系统中用于支持Netlogon服务的一个网络协议。这个协议主要用于客户端与域控制器之间进行身份验证和其他安全相关操作。NRPC是Windows网络中的重要协议之一,通常与ActiveDirectory(AD)和Kerberos身份验证系统......
  • python音乐推荐系统(双协同过滤推荐算法)Django框架 大数据毕业设计 MySQL数据库(建议收
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • go框架读取外部json文件数据,gin框架读取外部json文件数据
    1、封装方法funcgetSetting()(map[string]interface{},error){ //获得当前项目路径 currentDir,err:=os.Getwd() iferr!=nil{ returnnil,err } //读取文件内容 file,err:=os.Open(currentDir+"/configs/setting.json") iferr!=nil{ ret......
  • 602 [CF 1385D] a-Good String
    //602[CF1385D]a-GoodString.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/978给你一个长度为n的由小写字母组成的字符串s,保证n=2k,其中k为大于等于零的整数。一个非空字符串s被称为c-good(c为a.........
  • 基于Python+Django的网上银行综合管理系统设计与实现(毕业设计/课程设计源码+论文+部署
    文章目录前言详细视频演示项目运行截图技术框架后端采用Django框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • MongoDB 创建用户、导出数据库、导入数据库库
    【数据库】MongoDB创建用户、导出数据库、导入数据库库一、两套MongoDB集群超级管理员信息1,第一套MongoDB集群   172.26.1.9:30000 超级管理员用户名:XX 密码:XX2,第二套MongoDB集群 172.26.1.31:27017超级管理员用户名:XX密码:XX 注意:地铁用:172.26.1.31:2......
  • Google Play 开发者账号申请指南
    先聊下出海应用为啥要上架GooglePlay?在海外,GooglePlay是绝大多数海外用户唯一信任和熟悉的应用分发平台,所以对于任何出海的应用来说,GooglePlay都是逃不过的大型流量池,也是出海需要迈出的第一步。退一步说,杠精想说我可以通过APK线下推广,不好意思,GooglePlay作为手机系统级......
  • Google Chrome cursor auto edit mode bug All In One
    GoogleChromecursorautotexteditmodebugAllInOneGoogleChrome光标自动进入文本编辑模式bugtextcursorbug问题分析:可能是清洁键盘的时候,不小心按到了F7键,导致自动开启了插入符号浏览模式solutionsPresstheF7keyofkeybaord,TurnOn/TurnOff......