使用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. 在Ubuntu系统上手动安装GCC环境

    Ubuntu系统是自带GCC安装指令的apt install gcc,当前apt源中gcc版本为5.4.0,版本太低,推荐手动安装gcc8.3.0 手动安装gcc8.3.0之前需要先确保安装gcc环境 ...

  2. 【转载】理解分布式id生成算法SnowFlake

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. https://segmentfault.com/a/1190000011282426 概述 SnowFlake算 ...

  3. Qt开源作品35-秘钥生成器

    一.前言 在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制. 远程联网激活,每次启动都联网查看使用时间等,这种方法最完 ...

  4. C#+ WPF 实现蓝牙转WIFI计步上位机

    前言 一个WIFI上位机,接收底层MPU6050数据,途中转蓝牙从机透传,到蓝牙主机直连WIFI,PC端UDP通信,实现三轴加速度数据传送和计步功能. 项目介绍 本项目基于.NET平台,使用WPF开发 ...

  5. vue实现自定义音乐播放器

    项目中遇到了,让实现一个音乐播放器的功能.修改其样式要求自定义,切需要有,进度条,时间,开关,应用于H5需要兼容ios与android.简单看一下如图播放器 完成代码 audioCom.vue < ...

  6. manim边做边学--动画联动

    今天介绍Manim中的动画联动的技巧,在数学动画中,动画联动是常用的功能, 比如讲解平面几何中三角形与圆的位置关系变化,通过动画联动可以让圆沿着三角形的边滚动,或者让三角形的顶点在圆上移动,从而直观地 ...

  7. ReactNative开发总结

    https://www.jianshu.com/u/b09c3959ab3b ReactNative之项目结构介绍 一.初始化ReactNative工程 自动创建iOS和安卓工程,和对应的JS文件,i ...

  8. Kubernetes 深入学习

    目录 一.简介 1.Kubernetes 是什么 2.Kubernetes 特性 二.集群架构与组件 1.Master 2.Node 三.核心概念 四.集群搭建 -- 平台规划 1.生产环境 K8S ...

  9. 项目PMP之五项目范围管理

    项目PMP之五--项目范围管理   一.定义:确保项目做且只做所需的工作:范围包括产品范围(特性和功能)和项目范围(交付产品所需完成的工作) 适应型生命周期:相关方持续参与,应对大量变更(敏捷),实时 ...

  10. 一文读懂 es6 中class方法中的this绑定

    一直以来有这么个疑问? class 的方法中没有自动的绑定this 为什么手动绑定之后,在绑定之后的方法里调用class中的其他的方法(这个方法为什么就能使用this,不也应该是null或者undef ...