使用makefile帮助GO项目开发

news/2025/1/5 7:28:57/文章来源:https://www.cnblogs.com/xuhe2/p/18648911

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

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

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

Makefile

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

# -------------------------------------------------------------------------------
# Makefile for go project
# -------------------------------------------------------------------------------# -------------------------------------------------------------------------------
# variables
# -------------------------------------------------------------------------------
MAIN_FILE := main.goBIN_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: testgo 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 cleanrm -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: testgo 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 cleanrm -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退出, 因为出现了错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863139.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android GKD(自定义屏幕点击) v1.9.3

GKD是一款基于无障碍、高级选择器和订阅规则的自定义屏幕点击APP,为用户提供了更加便捷和智能的交互体验。通过点击跳过任意开屏广告或关闭应用内部任意弹窗广告,用户可以迅速进入应用的核心功能,而无需被广告打断。获取地址:https://www.dmjf.top/2678.html

Win32汇编学习笔记02.RadAsm和联合编译

https://bpsend.net/thread-151-1-1.html汇编使用资源 汇编使用资源的方式和C的一样,也是把资源文件 rc 编译成 res 再链接进去,汇编没有自己的资源编辑器,需要借助 vc6.0或者 vs 主要是把 头文件 .h 转化为对应的 .inc 使用vc6.0建立资源文件用vs建立资源文件新建一个桌面向导…

判断方法的使用范围20250102

判断方法的使用范围20250102package com.oop.demo01;public class Student {public static int add(int a, int b) { //public 类下的public的静态方法return a+b;}static int sub(int a, int b) { //public类 非public的静态方法return a-b;}public int devide(int a, int…

火绒(杀毒软件) v6.0.1.4 正式版

火绒这个软件很受极客们的欢迎,是一款小巧轻便的杀毒软件,功能也很丰富,运行安静,使用方便。也是果核很喜欢的一款杀毒软件,其火绒剑是一款非常强大的系统监控和调试工具,能帮助有电脑底层基础的用户快速排查问题。获取地址:https://www.dmjf.top/2255.html

Android AdGuard(广告拦截) v4.7.163 高级版

Adguard为你提供了一个可靠的、可管理的保护,就没有你们的参与滤波器加载网页。adguard移除所有烦人的广告,阻止危险网站的加载,也不会允许任何人在网上跟踪你的活动。获取地址:https://www.dmjf.top/2690.html

Windows编译QT6.4.3及使用

1. 下载QT6.4.3源码,并解压 Index of /archive/qt/6.4/6.4.3/singlehttps://download.qt.io/archive/qt/6.4/6.4.3/single/ 2.安装环境 * CMake 3.18 or later* Perl 5.8 or later* Python 2.7 or later* C++ compiler supporting the C++17 standard 3.打开windows的cmd cd…

ESP32-S3-N16R8在platformio中的开发板设置

前言 platformio现有的板子库里面没有ESP32-S3-N16R8(8MB PSRAM + 16MB FLASH)的开发板模型,直接强行套用,要么就是解锁不了8MB PSRAM,要么就下载后运行不起来。一、选用esp32-s3-devkitc-1开发板 先选用esp32-s3-devkitc-1作为开发板模型,点击Finish后务必耐心等待。 二…

《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis

《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis@目录8.Docker常规安装简介8.1 docker常规安装总体步骤8.2安装tomcat8.3 安装mysql8.3.1 docker hub上面查找mysql镜像8.3.2 从docker hub上(阿里云加速器)拉取mysql镜像…

Elasticsearch VS Easysearch 性能测试

压测环境 虚拟机配置 使用阿里云上规格:ecs.u1-c1m4.4xlarge,PL2: 单盘 IOPS 性能上限 10 万 (适用的云盘容量范围:461GiB - 64TiB)vCPU 内存 (GiB) 磁盘(GB) 带宽(Gbit/s) 数量16 64 500 5000 24Easysearch 配置 7 节点集群,版本:1.9.0实例名 内网 IP 软件 vCPU JVM 磁…

win10/win11 用 ncpa.cpl 命令快速打开网络连接

前言:Win11系统配置网络适配器好费劲的,每次都要在设置找半天 得,直接来,快捷键安排1、开始 -> 运行 Win + R 弹出 运行 窗口2、输入命令 ncpa.pcl并回车 3、见证奇迹QQ:1061767621 Q群:215481318

基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真

1.课题概述 基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介最大功率点跟踪(Maximum Power Point Tracking, MPPT)是光伏发电系统中至关重要的技术,用于确保光伏电池在其工作条件下输出最…

网络_网络分层模型和应用协议

本文主要介绍了网络的分层模型和应用层的协议,分层模型有四层、七层、五层这几种模型,应用层协议主要涉及 URL 和 HTTP,并且介绍了请求和响应以及他们的行、头、体网络分层模型和应用协议 分层模型 为了解决复杂问题往往分层 经过不断的演化,网络最终形成了五层模型:MAC像…