使用makefile帮助GO项目开发
使用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退出, 因为出现了错误
使用makefile帮助GO项目开发的更多相关文章
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 昨晚上熬夜写了[Openwrt项目开发笔记]:O ...
- Ubuntu系统---进行C++项目开发的工具
Ubuntu系统---进行C++项目开发的工具 在Ubuntu系统下进行C++工作任务,还没接触过.像 Windows + vs 一样,Ubuntu应该也有自己的C++开发工具.网上搜罗了一圈,发现有 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- HTML+CSS项目开发总结
好几天没更新博客了,刚实战完一个HTML+CSS的简单项目.经过几天的摸索,发现收益良多.之前只是单纯得写demo,看知识点,没有亲自实战项目.但实战过后才会了解,如何才能更好地提升自己的技术.针对这 ...
- 简历生成平台项目开发-STEP2问卷调查结果统计分析
根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...
- 如何使用Worktile进行敏捷项目开发管理
Worktile在任务管理上采用了看板视图,非常适合进行敏捷项目开发管理.事实上,在开发Worktile的过程中,我们也是自产自销,使用Worktile管理Worktile本身的开发过程,在本文中跟大 ...
- Java进击C#——项目开发环境
本章简言 上一章我们了解一下开发环境,知道了什么去新建一个项目工程.却并没有去项目工程进行介绍.可是之后我们会常常跟项目工程打交道.所以这章笔者就对项程工程的常用的一些功能进行讲解.当然说全面那是不可 ...
- 关于举办 2015年 Autodesk 助力云应用项目开发活动通知
各位尊敬的Autodesk 合作伙伴,大家好! 相信您在过去的一年里应该对Autodesk最新的云服务技术有所了解,您是不是曾经闪现过一些很好的想法,却由于不确定是否真实可行,或担心没有技术支持来帮助 ...
- .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)
Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...
- [转]基于Starling移动项目开发准备工作
最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...
随机推荐
- office文件所对应的的 Content-type类型总结
最近做文件下载因为涉及到不同类型的文件,所以重新查阅了一下文件所对应的的content-type类型,好记性不如烂笔头,记录一下. 文件后缀 MIME TYPE .doc application/ms ...
- Qt/C++编写监控实时显示和取流回放工具(回放支持切换进度)
一.前言 现在各个监控大厂做的设备,基本上都会支持通过rtsp直接取流显示,而且做的比较好的还支持通过rtsp回放取流,基本上都会约定一个字符串的规则,每个厂家都是不一样的规则,比如回放对应的rtsp ...
- Qt开源作品20-PNG图片警告去除工具
一.前言 在新版的Qt5中,我们之前在Qt4中使用的png图片,到了这里经常会报一个警告,libpng warning: iCCP: known incorrect sRGB profile,尽管这种 ...
- Web网页端IM产品RainbowChat-Web的v7.2版已发布
一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...
- IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计
本文由徐宁发表于腾讯大讲堂,原题"程序员如何把你关注的内容推送到你眼前?揭秘信息流推荐背后的系统设计",有改动和修订. 1.引言 信息推流(以下简称"Feed流" ...
- 今天记录一下vue更改时间格式的js
首先定义js文件,我这边定义为date.js,里面包含了增加零的处理 //date.jsexport function formatDate(date, fmt) { if (/(y+)/.test( ...
- RPA_Robocorp
一.RCC使用(https://robocorp.com/docs/rcc/workflow) 1. Creat a new bot : rcc create my-robot 2. Adding ...
- Solution Set -「LOCAL」冲刺省选 Round XXIX
\(\mathscr{Summary}\) 啊--说老实话,早上昏昏欲睡的,起码浪费了一个多小时.比赛打麻了 qwq. A 题类似费用提前计算,回忆起这个 trick 之后就简单了.B 题又错 ...
- CDS标准视图:维护包数据 I_MaintenancePackageData
视图名称:维护包数据 I_MaintenancePackageData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMAINTPCKGDATA' ...
- Java Spring Cloud Nacos 配置修改不生效的解决方法
一.引言 在微服务架构中,配置管理是一个关键部分.Nacos作为一个动态服务发现.配置管理和服务管理平台,广泛应用于Java Spring Cloud项目中.然而,有时在修改Nacos配置后,这些更改 ...