百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Air - 提高开发效率的 Go 语言热重载工具

bigegpt 2024-08-24 23:11 2 浏览

对于 web 后端开发而言,往往会在开发环境中,一边运行服务,另一边同时修改代码。我们往往希望,在修改代码并保存后,运行的服务能够自动更新,便于我们观察代码修改的效果。

对于脚本语言来说,它们没有编译的过程,重新加载服务是比较容易做到的。而对于 Go 语言来说,热重载并不是一个那么容易实现的功能,web 框架往往也没有内置该功能。Air,为 Go 语言提供了基于配置文件的热重载功能,能够提高开发效率。

简介

Air,是 cosmtrek 在 Github 上开源的 Go 语言热重载工具,仓库位于 https://github.com/cosmtrek/air,目前版本为 v1.27.2。

Air 通过监听代码文件或目录的变化,进行自动编译和重启程序,大大提高了 Go 程序的开发效率。相比于其他 Golang 热重载工具,air:

  • 提供了颜色丰富的日志输出
  • 能够自定义编译命令
  • 支持把特定的文件夹剔除出监听目标
  • 支持监听在 air 启动后再新建的目录
  • 提供了更好的编译过程


使用

Air 可以全局安装,使用项目提供的 install.sh 脚本:

# 安装到 $(go env GOPATH)/bin/air
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin

# 安装到 ./bin/
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s

也可以使用 docker 镜像 cosmtrek/air:

docker run -it --rm \
    -w "<PROJECT>" \
    -e "air_wd=<PROJECT>" \
    -v $(pwd):<PROJECT> \
    -p <PORT>:<APP SERVER PORT> \
    cosmtrek/air
    -c <CONF>

对于单一项目中,也可以直接使用 Go Module 安装:

go get -u github.com/cosmtrek/air


我们来看一个最简单的例子。首先,我们创建一个简单的服务器程序:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, world!")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", index)

    server := &http.Server{
        Handler: mux,
        Addr:    ":8080",
    }

    log.Fatal(server.ListenAndServe())
}

我们按正常的流程运行程序:

$ go run main.go

在浏览器中访问 localhost:8080,就能看到 Hello, world! 的响应了。

使用 air,我们把 go run 替代为 air 命令:

$ air

Air 会自动编译,启动程序,并监听当前目录中的文件修改。当把代码中的 Hello, world! 改为 Hello, go!,之后,无需停止并重新编译,就能自动重新加载修改后的项目。访问服务器地址,响应变为了 Hello, go!。

直接执行 air 命令,使用的是默认配置。如果需要更为定制化的配置,可以以 air 项目中提供的 air_example.toml 配为模版进行定制修改。

# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main ."
# Binary file yields from `cmd`.
bin = "tmp/main"
# Customize binary.
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# Exclude specific regular expressions.
exclude_regex = []
# Exclude unchanged files.
exclude_unchanged = true
# Follow symlink for directories
follow_symlink = true
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true

这个 toml 格式蛾配置文件,放置在项目的根目录下。配置项包括:

  • root:根目录路径
  • tmp_dir:临时文件路径
  • build:编译命令,包括命令、日志、重启等额相关配置
  • log:日志输出配置
  • color:日志颜色配置
  • misc:其他杂项

其中最为重要的是 build 编译命令的配置,包括子配置项:

  • cmd:编译的 shell 命令
  • bin:编译得到的二进制输出的路径,一般放在临时路径
  • full_bin:包括环境变量等的自定义二进制文件
  • include_ext:需要监听的文件的文件扩展
  • exclude_dir:需要排除监听的文件夹
  • include_dir:需要监听的文件夹,默认全部
  • exclude_file:排除监听的特定文件
  • exclude_regex:排除监听的文件的正则模式
  • exclude_unchanged:是否排除未变化的文件
  • follow_symlink:是否跟随文件链接
  • delay:触发重新编译的延迟时间,防止频繁修改带来的过于频繁的编译
  • stop_on_error:是否在编译出错后停止
  • log:日志输出文件
  • send_interrupt:是否在项进程发送 kill 之前发送 interrupt 信号
  • kill_delay:发送 interrupt 后到发送 kill 之间的的延迟时间

可以看到,air 提供了十分丰富的热加载配置,可以根据个人开发习惯和项目特性进行个性化配置,以适应不同的开发使用需求。


总结

Air 通过监听代码文件或目录的变化,进行自动编译和重启程序,大大提高了 Go 程序的开发效率。Air 提供了颜色丰富的日志输出,能够自定义编译命令,支持把特定的文件夹剔除出监听目标,支持监听在 air 启动后再新建的目录,提供了更好的编译过程。

默认的配置下,air 提供了足够好的热重载配置,直接替换 go run 命令为 air 命令就能实现热重载。同时,air 也以配置文件的形式提供了更为复杂和强大的配置功能,使其能够满足各种场景下的需求,十分灵活可扩展。

相关推荐

AI「自我复制」能力曝光,RepliBench警示:大模型正在学会伪造身份

科幻中AI自我复制失控场景,正成为现实世界严肃的研究课题。英国AISI推出RepliBench基准,分解并评估AI自主复制所需的四大核心能力。测试显示,当前AI尚不具备完全自主复制能力,但在获取资源...

【Python第三方库安装】介绍8种情况,这里最全看这里就够了!

**本图文作品主要解决CMD或pycharm终端下载安装第三方库可能出错的问题**本作品介绍了8种安装方法,这里最全的python第三方库安装教程,简单易上手,满满干货!希望大家能愉快地写代码,而不要...

pyvips,一个神奇的 Python 库!(pythonvip视频)

大家好,今天为大家分享一个神奇的Python库-pyvips。在图像处理领域,高效和快速的图像处理工具对于开发者来说至关重要。pyvips是一个强大的Python库,基于libvips...

mac 安装tesseract、pytesseract以及简单使用

一.tesseract-OCR的介绍1.tesseract-OCR是一个开源的OCR引擎,能识别100多种语言,专门用于对图片文字进行识别,并获取文本。但是它的缺点是对手写的识别能力比较差。2.用te...

实测o3/o4-mini:3分钟解决欧拉问题,OpenAI最强模型名副其实!

号称“OpenAI迄今为止最强模型”,o3/o4-mini真实能力究竟如何?就在发布后的几小时内,网友们的第一波实测已新鲜出炉。最强推理模型o3,即使遇上首位全职提示词工程师RileyGoodsid...

使用Python将图片转换为字符画并保存到文件

字符画(ASCIIArt)是将图片转换为由字符组成的艺术作品。利用Python,我们可以轻松实现图片转字符画的功能。本教程将带你一步步实现这个功能,并详细解释每一步的代码和实现原理。环境准备首先,你...

5分钟-python包管理器pip安装(python pip安装包)

pip是一个现代的,通用、普遍的Python包管理工具。提供了对Python包的查找、下载、安装、卸载的功能,是Python开发的基础。第一步:PC端打开网址:选择gz后缀的文件下载第二步:...

网络问题快速排查,你也能当好自己家的网络攻城狮

前面写了一篇关于网络基础和常见故障排查的,只列举了工具。没具体排查方式。这篇重点把几个常用工具的组合讲解一下。先有请今天的主角:nslookup及dig,traceroute,httping,teln...

终于把TCP/IP 协议讲的明明白白了,再也不怕被问三次握手了

文:涤生_Woo下周就开始和大家成体系的讲hadoop了,里面的每一个模块的技术细节我都会涉及到,希望大家会喜欢。当然了你也可以评论或者留言自己喜欢的技术,还是那句话,希望咱们一起进步。今天周五,讲讲...

记一次工控触摸屏故障的处理(工控触摸屏维修)

先说明一下,虽然我是自动化专业毕业,但已经很多年不从事现场一线的工控工作了。但自己在单位做的工作也牵涉到信息化与自动化的整合,所以平时也略有关注。上一周一个朋友接到一个活,一家光伏企业用于启动机组的触...

19、90秒快速“读懂”路由、交换命令行基础

命令行视图VRP分层的命令结构定义了很多命令行视图,每条命令只能在特定的视图中执行。本例介绍了常见的命令行视图。每个命令都注册在一个或多个命令视图下,用户只有先进入这个命令所在的视图,才能运行相应的命...

摄像头没图像的几个检查方法(摄像头没图像怎么修复)

背景描述:安防监控项目上,用户的摄像头运行了一段时间有部分摄像头不能进行预览,需要针对不能预览的摄像头进行排查,下面列出几个常见的排查方法。问题解决:一般情况为网络、供电、设备配置等情况。一,网络检查...

小谈:必需脂肪酸(必需脂肪酸主要包括)

必需脂肪酸是指机体生命活动必不可少,但机体自身又不能合成,必需由食物供给的多不饱和脂肪酸(PUFA)。必需脂肪酸主要包括两种,一种是ω-3系列的α-亚麻酸(18:3),一种是ω-6系列的亚油酸(18:...

期刊推荐:15本sci四区易发表的机械类期刊

  虽然,Sci四区期刊相比收录在sci一区、二区、三区的期刊来说要求不是那么高,投稿起来也相对容易一些。但,sci四区所收录的期刊中每本期刊的投稿难易程度也是不一样的。为方便大家投稿,本文给大家推荐...

be sick of 用法考察(be in lack of的用法)

besick表示病了,做谓语.本身是形容词,有多种意思.最通常的是:生病,恶心,呕吐,不适,晕,厌烦,无法忍受asickchild生病的孩子Hermother'sverysi...