go使用makefile脚本编译应用的方法小结

1. go介绍

Go官方 提供一个名为go的命令,该命令可以用来下载go的依赖,构建安装go应用,运行和测试 Go程序等等, 我们比较常用的比如go get, go mod, go run , go test等等。

但是,我们在 Go 项目中为了简化使用 go 命令的复杂性,规范团队使用 go 命令的方式,提升个人或团队的生产力,我们会使用makefile脚本,使用make来处理一些任务。

2. make及makefile

makefile可以看作是make工具的脚本文件, 而make主要用来处理一系列命令。常用的比如用来编译和打包文件, 在C/C++的编译打包中应用最广泛了。

makefile文件结构其实也比较简单:

target ... : prerequisites ...
    command
    ...
    ...

target

可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites

生成该target所依赖的文件和/或target

command

该target要执行的命令(任意的shell命令)

makefile文件主要定义了执行目标应用, 它依赖哪些文件或者目标, 以及当前目标需要执行的command指令。有依赖项,他会先去执行依赖项的command。

具体的学习可以参考:makefile介绍 — 跟我一起写Makefile 1.0 文档

3. 使用makefile编译打包go应用

这里我们使用makefile来简单实现一个将go应用变异打包为不同系统的应用的示例:

.PHONY: all run clean help

APP = task

## linux: 编译打包linux
.PHONY: linux
linux:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-linux64 ./main.go

## win: 编译打包win
.PHONY: win
win:
	CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-win64.exe ./main.go

## mac: 编译打包mac
.PHONY: mac
mac:
	CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build $(RACE) -o ./bin/${APP}-darwin64 ./main.go

build:
	@go build -o ${APP}

## 编译win,linux,mac平台
.PHONY: all
all:win linux mac

run:
	@go run ./

.PHONY: tidy
tidy:
	@go mod tidy

## test: Run unit test.
.PHONY: test
test:
	@$(MAKE) go.test

## 清理二进制文件
clean:
	@if [ -f ./bin/${APP}-linux64 ] ; then rm ./bin/${APP}-linux64; fi
	@if [ -f ./bin/${APP}-win64.exe ] ; then rm ./bin/${APP}-win64.exe; fi
	@if [ -f ./bin/${APP}-darwin64 ] ; then rm ./bin/${APP}-darwin64; fi

help:
	@echo "make - 格式化 Go 代码, 并编译生成二进制文件"
	@echo "make mac - 编译 Go 代码, 生成mac的二进制文件"
	@echo "make linux - 编译 Go 代码, 生成linux二进制文件"
	@echo "make win - 编译 Go 代码, 生成windows二进制文件"
	@echo "make tidy - 执行go mod tidy"
	@echo "make run - 直接运行 Go 代码"
	@echo "make clean - 移除编译的二进制文件"
	@echo "make all - 编译多平台的二进制文件"

4. 一些go项目的makefile参考 kratos微服务框架makefile

项目地址:kratos/Makefile at main · go-kratos/kratos · GitHub

kratos应用使用makefile文件打包,它比我们示例多添加了go工具的环境配置部分,还有自动生成使用gen工具编译proto文件,我们可以根据实际项目需要添加。

iam身份识别系统使用makefile

项目地址:

iam项目使用makefile更多,它分为一个入口的makefile文件,同时它引入了项目scripts目录下的多个功能的脚本,如下图。 它将每个功能部分干的事情分拆到不同脚本文件,这样更清晰。提供的功能也更清晰细致。

到此这篇关于go使用makefile脚本编译应用的文章就介绍到这了,更多相关gomakefile编译应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go项目编写Makefile规则文件概述

    目录 make介绍 Makefile介绍 Makefile文件教程解析 规则概述 示例 make介绍 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程. make是一个构建自动化工具,会在当前目录下寻找Makefile或makefile文件.如果存在相应的文件,它就会依据其中定义好的规则完成构建任务. Makefile介绍 我们可以把Makefile简单理解为它定义了一个项目文件的编译规则.借助Makefile我们在编译过程中不再需要每次手

  • Makefile构建Golang项目示例详解

    目录 背景 创建项目并运行 添加 Makefile 文件 Makefile 概念 变量 使用 Makefile 自动化任务 背景 构建和测试大型项目时都会很耗时,且容易出错.开发者在开发过程中需要不断执行go build.go run .go test等相关命令.还可能需要多个命令来构建不同平台的二进制文件.在正式部署时候,我们可能还需要安装一些依赖项,或者在发布之前进行代码覆盖率测试等相关前置工作. 整个过程需要很多步骤,但我们有一种简单的方法可以解决这些复杂琐碎的步骤.使用 Make 进行自

  • golang构建工具Makefile使用详解

    目录 正文 正文 可能是因为编译太简单了,golang 并没有一个官方的构建工具(类似于 java 的 maven 和 gradle之类的),但是除了编译,我们可能还需要下载依赖,运行测试,甚至像 easyjson,protobuf,thrift 这样的工具下载和代码生成,如果没有构建工具,这些工作就会非常麻烦 为了解决这个问题,之前写过一个 everything.sh 的脚本,把所有的操作都封装在这个脚本里面,只需要执行类似于 sh everything.sh dependency 的命令就可

  • go使用makefile脚本编译应用的方法小结

    1. go介绍 Go官方 提供一个名为go的命令,该命令可以用来下载go的依赖,构建安装go应用,运行和测试 Go程序等等, 我们比较常用的比如go get, go mod, go run , go test等等. 但是,我们在 Go 项目中为了简化使用 go 命令的复杂性,规范团队使用 go 命令的方式,提升个人或团队的生产力,我们会使用makefile脚本,使用make来处理一些任务. 2. make及makefile makefile可以看作是make工具的脚本文件, 而make主要用来处

  • linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)

    注意!!! 这种情况其实可以在安装虚拟机过程中进行避免得,下次测试装虚拟机的时候直接选择开发工具就可以了 好啦言归正传,这次是帮助大家解决问题得,首先输入make会有下图的显示 这种情况下如果是有网环境直接输入yum -y install make 就可以解决,若是无网环境则需要上网上下载源码包进行上传 yum -y install make 无网环境下在下面这个网址进行下载,在通过xftp上传到linux系统中 http://ftp.gnu.org/gnu/make/make-4.2.tar.

  • Linux Centos下使用脚本安装Docker的方法

    Docker的主要作用是什么? 目前来看bai,Docker至少有以下应用场景: 1)测试:Docker 很适du合用于测试发布,将 Docker 封装后可zhi以直接提dao供给测试人员进行运行,不再需要测试人员与运维.开发进行配合,进行环境搭建与部署. 2)测试数据分离:在测试中,经常由于测试场景变换,需要修改依赖的数据库数据或者清空变动 memcache.Redis 中的缓存数据.Docker 相较于传统的虚拟机,更轻量与方便.可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行

  • shell脚本5种执行方式及脚本不同的执行方法和区别详解

    目录 前言 概述 正题 一.方式1绝对路径和方式2相对路径,可以归纳为同一种方法 二.方式3使用 sh/bash命令来执行 三.方式4使用 . (空格)脚本名称来执行 四.方式5使用 source 来执行(主要用于生效配置文件) 区别 1.关于执行权限 2.关于是否开启子shell线程 总结 前言 shell脚本是一种脚本语言,他不需要编译,而是直接通过解释器,将脚本作为解释器程序的参数运行的. 我们通过编写vim test.sh,然后用不同方法执行名为test.sh的脚本. #!/bin/ba

  • win7下从ruby源代码编译安装的方法

    工作中需要在c++代码中嵌入ruby c api,然而在vs工程中编译失败,所以现在通过手动从源代码编译ruby寻找原因(之前使用rubyinstaller安装). 先从官网下载ruby 2.4.1 版本,https://www.ruby-lang.org/en/downloads/ 从安装指导可以看到,官方只提供了linux平台下的编译安装步骤,https://www.ruby-lang.org/en/documentation/installation/#building-from-sour

  • javascript 动态脚本添加的简单方法

    异步加载js文件或者异步加载js模块,支持所有浏览器,包括IE,参考至javascript高级编程 1.createScript方法用于创建一个script标签并添加到body标签中 2.createModule方法用于创建一个script脚本的标签,并且如果在IE8以下的版本运行会抛出异常,在异常捕获模块中执行script.text兼容IE添加js的脚本内容. <button id="demo">js文件</button> <button id=&quo

  • PHP编程实现脚本异步执行的方法

    本文实例讲述了PHP编程实现脚本异步执行的方法.分享给大家供大家参考,具体如下: php语言得用fsockopen()函数,实现脚本异步运行,代码如下 异步请求函数(用debug参数若为true则为用为调试,开启调试可以看到异步的执行情况,但是失去异步的效果) main.php <?php function request_by_fsockopen($url,$post_data=array(),$debug=false){ $url_array = parse_url($url); $host

  • 用vbs在 HTA 内对脚本进行编码的方法

    问: 您好,脚本专家!如何在 HTA 内对脚本进行编码? -- LL 答: 您好,LL.您知道,刚看到这个问题时,我们就在想:"这有什么大不了的?难道不能像在 HTML 文件中那样在 HTML 应用程序 (HTA) 中对脚本进行编码吗?"令我们大为吃惊的是,好像不能在 HTA 中对脚本进行编码:每次试图这样做时,都会返回像下面这样的错误消息: Scripting encoder object ("Scripting.Encoder") failed on C:\Sc

  • Python脚本处理空格的方法

    最近小编遇到一个奇葩问题,就是上传代码时拷贝vs里面的代码不能直接粘贴,否则空格会不符合要求,怎么解决此问题呢?下面小编给大家分享我的解决方案,希望能够帮助到大家! 去掉空格代码 # -*- coding: utf-8 -*- '''打开delSpace.txt文本并删除每行开头的八个空格''' f=open("delSpace.txt") lines=f.readlines() for line in lines: '''第8位至倒数第1位(但不包含它)''' print line[

  • JavaScript脚本库编写的方法

    JavaScript就是所谓的客户端脚本语言,是一种在互联网浏览器(浏览器也称为Web客户端,因为它连接到Web服务器上,以下载页面)内部运行的计算机编程语言.JavaScript的工作方式很有趣.普通网页内都会插入一些JavaScript代码.当浏览器加载该页面时,浏览器的内置解释器将读取并运行它在该页面中找到的JavaScript代码. 做Web开发已经四年,或多或少积累了一些JavaScript脚本.比如,限制input只允许输入数字的脚本:敲回车自动转到下一个控件,相当于Tab键的作用一

随机推荐