百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-21 12:01 14 浏览 0 评论

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

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

go air

简介

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

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

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

go 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!。

go ar

直接执行 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 也以配置文件的形式提供了更为复杂和强大的配置功能,使其能够满足各种场景下的需求,十分灵活可扩展。

go air

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码