使用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项目开发的更多相关文章

  1. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 昨晚上熬夜写了[Openwrt项目开发笔记]:O ...

  2. Ubuntu系统---进行C++项目开发的工具

    Ubuntu系统---进行C++项目开发的工具 在Ubuntu系统下进行C++工作任务,还没接触过.像 Windows + vs 一样,Ubuntu应该也有自己的C++开发工具.网上搜罗了一圈,发现有 ...

  3. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  4. HTML+CSS项目开发总结

    好几天没更新博客了,刚实战完一个HTML+CSS的简单项目.经过几天的摸索,发现收益良多.之前只是单纯得写demo,看知识点,没有亲自实战项目.但实战过后才会了解,如何才能更好地提升自己的技术.针对这 ...

  5. 简历生成平台项目开发-STEP2问卷调查结果统计分析

    根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...

  6. 如何使用Worktile进行敏捷项目开发管理

    Worktile在任务管理上采用了看板视图,非常适合进行敏捷项目开发管理.事实上,在开发Worktile的过程中,我们也是自产自销,使用Worktile管理Worktile本身的开发过程,在本文中跟大 ...

  7. Java进击C#——项目开发环境

    本章简言 上一章我们了解一下开发环境,知道了什么去新建一个项目工程.却并没有去项目工程进行介绍.可是之后我们会常常跟项目工程打交道.所以这章笔者就对项程工程的常用的一些功能进行讲解.当然说全面那是不可 ...

  8. 关于举办 2015年 Autodesk 助力云应用项目开发活动通知

    各位尊敬的Autodesk 合作伙伴,大家好! 相信您在过去的一年里应该对Autodesk最新的云服务技术有所了解,您是不是曾经闪现过一些很好的想法,却由于不确定是否真实可行,或担心没有技术支持来帮助 ...

  9. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

  10. [转]基于Starling移动项目开发准备工作

    最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...

随机推荐

  1. Qt加载天地图离线api开发包/从官网趴地图js代码/费了九牛二虎之力终于搞定

    一.前言说明 网上关于如何趴天地图离线api文件的文章,只有少量的两三篇,而且几乎没有说全和说对,搞得评论也是一片懵逼,这里不行那你不行,思路可以借鉴就是.索性花了点时间,自己研究了如何从官网一步步趴 ...

  2. Qt/C++音视频开发52-采集本地屏幕桌面的终极设计

    一.前言 最开始设计的时候,只考虑了一个屏幕的情况,这种当然是最理想的情况,实际上双屏或者多屏的用户也不在少数,比如我这两个屏幕,屏幕1是1080P,屏幕2是2K分辨率,打印两个屏幕的区域是 QRec ...

  3. Qt编写的项目作品7-视频监控系统

    一.功能特点 (一)软件模块 视频监控模块,各种停靠小窗体子模块,包括设备列表.图文警情.窗口信息.云台控制.预置位.巡航设置.设备控制.悬浮地图.网页浏览等. 视频回放模块,包括本地回放.远程回放. ...

  4. Qt音视频开发31-Onvif抓拍图片

    一.前言 抓拍是个很重要的功能,比如在报警视频联动中需要一张实时的图片,很多SDK不提供抓拍功能,而通过预览抓图,得到的图片已不具有实时性,那如何得到实时的图片呢?现在的IPC基本上都支持ONVIF协 ...

  5. Net6之Jwt认证+Bearer认证 2.0

    以前接触过,写过博客,第二次再写有了新的体会.第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html 过程: 生成token令牌(钥匙) 添加bea ...

  6. IM扫码登录技术专题(四):你真的了解二维码吗?刨根问底、一文掌握!

    本文引用了ELab团队.腾讯大讲堂两个公众号分享的文章内容,引用内容见文末参考资料,感谢原作者的无私分享. 1.引言 对于市面上主流的IM来说,跟二维码有关的功能,比如扫码加好友.扫码登陆.扫码加群等 ...

  7. 记录实现倒计时的方法,配合按钮的disabled

    记录一个自己实现倒计时的方法,现在可以网上有很多插件,自己实现记录一下 // 倒计时 countDown() { this.disabled = true let number = 60 this.c ...

  8. bitset 学习笔记

    引入 顾名思义, \(\texttt{bitset}\) 是用 \(\texttt{bit}\) 组成的 \(\texttt{set}\); 区别于普通的 \(\texttt{bool []}\) 或 ...

  9. linxux学习01

    Linux第一天 1.为什么要学习linux? 因为大数据中绝大部分核心组件都是基于linux操作系统运行的,企业中基本上都是linux系统. 2.怎么去学linux?(什么是大数据) 大数据技术组件 ...

  10. Java之线程本地变量ThreadLocal-copy

    基本概念和用法 线程本地变量是说,每个线程都有同一个变量的独有拷贝,这个概念听上去比较难以理解,我们先直接来看类TheadLocal的用法. ThreadLocal是一个泛型类,接受一个类型参数T,它 ...