Makefile 如何构建Go项目

news2024/11/26 9:30:11

前言 📚

请问你是如何打包Go语言开发的项目呢?

是直接命令行输入?

go build .

开发调试时?

go run main.go

但是我们看到开源的Go语言项目运行时是:

make build || make install

我们打包运行的这个过程,有一个更加贴切的词语叫做构建项目

本文将个大家介绍 Makefile这个广为使用的构建工具,它是开源的,不仅仅适用于Go语言中,C语言或者C++等项目也同样使用。

1、make 简介 🎯

在软件开发中,make 通常被视为一种软件构建工具。该工具主要经有读取一种名为 makefile 或者 Makefile的文件来实现软件的自动化构建。

它会通过一种被称之为 target概念的来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。

在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或库文件。

img

img

2、安装 ⬇️

Mac 系统自带 make 命令,如果是 linux 就需要自己安装下 make,命令很简单。 Centons 系统安装 make命令:

yum install -y make

3、创建配置文件

新建一个工程,工程目录大概如下:

img

main.go 源码如下:

package main

import "fmt"

func main() {
    fmt.Println("hello world")
}

看着和以往的项目没区别,但是多个一个 Makefile 文件,如何使用 Makefile 构建项目呢,需要在里面添加如下代码:

BINARY_NAME=app
run:
	go build -o bin/${BINARY_NAME} -v
	./bin/${BINARY_NAME}

来解释一下各行的意思:

  • 第一行: 声明了一个变量 BINARY_NAME,它的值是app,方便后面使用
  • 第二行:声明了一个target,可以理解为一个对外的方法
  • 第三行:这就是该 target被调用时执行的脚本,当时是build该项目,编译后的二进制文件放在当前工程根目录下的 bin目录下,名字是变量 BINARY_NAME的值
  • 第四行:这一行是直接执行当前 bin目录下的二进制文件

注意

第三行和第四行前面要用 tab缩进,否则会报错

Makefile:3:*** missing separator. Stop.

附线上案例:

.PHONY: build

SERVICE := youservername
PACKAGE := test
MAIN := main
REGISTRY := zookeeper
AUTHOR := $(shell git log --pretty=format:"%an"|head -n 1)
VERSION := $(shell git rev-list HEAD | head -1)
BUILD_INFO := $(shell git log --pretty=format:"%s" | head -1)
BUILD_DATE := $(shell date +%Y-%m-%d\ %H:%M:%S)
CUR_PWD := $(shell pwd)
GO_VERSION := $(shell go version)
export GO111MODULE=on
export GOPROXY=***

LD_FLAGS='-X "$(PACKAGE)/version.TAG=$(TAG)" -X "$(PACKAGE)/version.VERSION=$(VERSION)" -X "$(PACKAGE)/version.AUTHOR=$(AUTHOR)" -X "$(PACKAGE)/version.BUILD_INFO=$(BUILD_INFO)" -X "$(PACKAGE)/version.BUILD_DATE=$(BUILD_DATE)" -X "$(PACKAGE)/version.GO_VERSION=$(GO_VERSION)"'

default: build

build:
		go build -tags "$(REGISTRY)" -ldflags $(LD_FLAGS) -o ./bin/$(SERVICE) ./$(MAIN)

race:
		go build -ldflags $(LD_FLAGS) -i -v -o ./bin/$(SERVICE) -race ./$(MAIN)
dev: build
		cp $(CUR_PWD)/conf/conf_dev.ini $(CUR_PWD)/conf/conf.ini && ./bin/$(SERVICE) -v=true
clean:
		rm bin/*

4、开始构建 🔛

make run

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mask RCNN网络源码解读(Ⅵ) --- Mask分支及Loss计算

目录 0.先决知识 1.简介 2.mask_rcnn.py解析 2.1 初始化函数 2.2 MaskRCNNHeads类 2.3 MaskRCNNPredictor类 3.RoIHeads类解析 3.1 正向传播过程 3.2 mask部分损失 3.3 maskrcnn_inference 0.先决知识 学习此篇博客之前,读者应有: ①一定的p…

MySQL常用命令 (这些命令专属于MySQL 不属于标准SQL语句)

1、查看MySQL版本 :select version(); ​​​​​​​ ​​​​​​​ ​​​​​​​ 2、创建数据库 :create database 数据库名称; 3、使用/指定数据库:use 数据库名称; 4、查看当前使用的数据库…

硬件系统工程师宝典(3)-----信号完整性分析是个啥?

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们读到硬件电路的概要设计需要考虑的问题,相关的可行性分析可以使开发工作事半功倍。信号完整性分析概述今天我们开始学习在高速电…

上海亚商投顾:两市震荡引分化 汽车产业链获青睐

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪大小指数今日走势分化,沪指全天弱势震荡,创业板指在权重股助力下,午后一度冲高涨…

靶机测试 0s-hackNos-2笔记

简介靶机地址https://www.vulnhub.com/entry/hacknos-os-hacknos-2,403/#Difficulty : Easy to IntermediateFlag : 2 Flag first user And second rootLearning : Web Application | Enumeration | Password Cracking测试过程信息收集nmap扫描端口nmap -p- -A 192.168.1.103 -…

如何在 Zorin OS 上安装 ONLYOFFICE 桌面编辑器

ONLYOFFICE 桌面应用是一款开源办公套件,包括用于文本文档、电子表格、演示文稿和表单的编辑器。除了离线工作,您还可以将该应用连接到云端进行在线文档协作。这款套件的源代码可在 GitHub 上获得,是根据 AGPL v.3.0 许可。 ONLYOFFICE桌面编…

golang中new与make的区别

new和make new // The new built-in function allocates memory. The first argument // is a type,not a value, and the value returned is a pointer to a // newly // allocated zero value of that type. func new(Type) *Type对于官方是这么解释new的:这个…

(6)go-micro微服务consul配置、注册中心

文章目录一 Consul介绍1. 注册中心Consul基本介绍2.注册中心Consul关键功能3.注册中心Consul两个重要协议二 Consul安装1.使用docker拉取镜像三 Config配置四 Consul代码编写1.设置consul配置中心2.获取consul配置中心的数据3.consul可视化界面数据编写4. main.go代码编写五 最…

微信小程序-页面导航

小程序实现页面导航的两种方式 声明式导航(tabBar 页面&#xff0c;在app.json中配置) 在页面上声明一个<navigator>导航组件通过点击<navigator> 组件实现页面跳转 app.json中 "tabBar": {"list": [{"pagePath": "pages/home…

【胖虎的逆向之路】02——Android整体加壳原理详解实现

【胖虎的逆向之路】(02)——Android整体加壳原理详解&实现 Android Apk的加壳原理流程及详解 文章目录【胖虎的逆向之路】(02)——Android整体加壳原理详解&实现前言一、加壳前的知识储备1. Android 应用的启动流程2. Android 应用的安装3. Android应用的启动流程&…

09-JAVA四种引用类型?

在JDK1.2版之后&#xff0c;Java对引用的概念进行了扩充&#xff0c;将引用分为强引用&#xff08;Strongly Reference&#xff09;、软引用&#xff08;Soft Reference&#xff09;、弱引用&#xff08;Weak Reference&#xff09;和虚引用&#xff08;Phantom Reference&…

使用Deep Q-Network学习如何玩《飞行的小鸟》游戏

目录概述效果需要的依赖如何运行算法原理实验输入处理网络结构训练代码概述 使用DQN实现《飞行的小鸟》游戏&#xff0c;代码可修改扩展为其他游戏&#xff0c;适合学习研究用。 效果 需要的依赖 Python 2.7 or 3 TensorFlow 0.7 pygame OpenCV-Python 如何运行 运行主函数…

目标追踪综述

目标追踪综述 - 知乎目标跟踪是计算机视觉领域的一个重要问题&#xff0c;目前广泛应用在体育赛事转播、安防监控和无人机、无人车、机器人等领域。下面是一些应用的例子。 体育赛事转播 无人车 目标跟踪任务分类了解了目标跟踪的用途&#xff0c;我们接下…https://zhuanlan.z…

Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式

前置说明 最为原始的打包方式spring-boot-maven-plugin插件jib-maven-plugin插件dockerfle-maven-plugin插件 最为原始的方式 也就是使用Docker的打包命令去打包&#xff0c;麻烦&#xff0c;我这里不多说。 spring-boot-maven-plugin插件打包 SpringBoot自己内置了一个Docker镜…

有了这些软件测试面试话术,offer想不拿到都难

软件测试是一个复杂且重要的技术岗位&#xff0c;因此&#xff0c;大多数互联网企业在面试时&#xff0c;都会严谨对待每一个面试者。而&#xff0c;作为即将去进行面试测试人来说&#xff0c;想要在面试中&#xff0c;沉着稳定地回答好面试官们提出的问题&#xff0c;前期的软…

P5 内积 -- 通讯原理

目录内积内积和傅里叶变换正交能量帕瑟瓦尔定理互能量一 内积定义&#xff1a;任意信号 内积定义为&#xff1a;如果都是实信号例&#xff1a;二 内积和傅里叶变换的关系傅里叶变换 和逆变换 本质上就是求两个函数的内积傅里叶变换傅里叶逆变换时域的内积等于频域的内积假设 则…

再获殊荣!维视智造斩获2022年度光能杯最具影响力“智造”企业奖

近日&#xff0c;由光伏行业权威媒体和机构——索比光伏网、索比咨询联合主办的2022年度“光能杯”影响力大奖榜单发布&#xff0c;维视智造凭借硬件与AI算法能力、凭借在光伏行业具有创新性的智能制造产品方案与落地的标杆案例&#xff0c;斩获“2022年最具影响力“智造”企业…

Windows下Canal.deployer-1.1.6安装部署

canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigger 获取增量变…

多线程之线程控制与互斥

1.线程的缺点有哪些&#xff1f; 第一点 健壮性低------ 一个线程挂了容易影响另外的线程 第二点 缺乏访问控制----- 不像进程是独立的&#xff0c;可以写时拷贝&#xff0c;线程随进随出有点危险哦 第三点 编写难度上升----- 编写一个多线程的代码和调试可比单线程难多了 ——…

strlen 的三种模拟方法

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 在C/C 中&#xff0c;strlen函数是一种计算字符串长度的库函数&#xff0c;要模拟此函数有多种方法&#xff0c;这里总结三种模拟方法。 1. strlen 函数介绍 cplusplus - strlen strlen 函数…