简介:

air是Go的热加载工具,它可以监听文件或者目录的变化,自动编译,重启程序,提高开发的工作效率。

场景:

在代码修改后需要通过ctrl+c来停止项目,go run的方式来再次重启项目,在开发进行中频繁操作会很麻烦,很影响开发的效率,air刚好解决了这种问题

Air的特性:

  1. 彩色日志输出
  2. 自定义构建或二进制命令
  3. 支持忽略子目录
  4. 启动后支持监听新目录
  5. 更好的构建过程

安装方式:

1、Go最原始的安装方法,但是配置文件会容易出问题:

go get -u github.com/cosmtrek/air

2、使用go install安装方法:

需要配置.bashrc.zshrcalias air='$(go env GOPATH)/bin/air'

source ~/.zshrc

使用 Go 的版本为 1.16-1.23(不包括1.23)

go install github.com/cosmtrek/air@v1.40.4

使用 Go 的版本为 1.23或更高(推荐此方法)

go install github.com/air-verse/air@latest

3、推荐使用 install.sh,但是博主本人使用的是第二种方式

# binary 文件会是在 $(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 air -v

4、Docker的安装方式

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

然后按照下面的方式在docker中运行项目:

docker run -it --rm \
-w "/go/src/github.com/cosmtrek/hub" \
-v $(pwd):/go/src/github.com/cosmtrek/hub \
-p 9090:9090 \
cosmtrek/air

使用方式(同官网的使用方式):

首先,进入你的项目文件夹

cd /path/to/your_project

最简单的方法是执行

# 优先在当前路径查找 `.air.toml` 后缀的文件,如果没有找到,则使用默认的
air -c .air.toml

您可以运行以下命令初始化,把默认配置添加到当前路径下的.air.toml 文件。

air init

在这之后,你只需执行 air 命令,无需添加额外的变量,它就能使用 .air.toml 文件中的配置了。

air

如欲修改配置信息,请参考 air_example.toml 文件.

运行时参数

# 会执行 ./tmp/main bench
air bench # 会执行 ./tmp/main server --port 8080
air server --port 8080

可以使用 -- 参数分隔为 air 命令传递的参数和构建的二进制文件。

# 会运行 ./tmp/main -h
air -- -h # 会使用个性化配置来运行 air,然后把 -h 后的变量和值添加到运行的参数中
air -c .air.toml -- -h

air_example.toml示例

完整的官网配置信息,根据需要修改。

# [Air](https://github.com/cosmtrek/air) TOML 格式的配置文件

# 工作目录
# 使用. 或绝对路径, 请注意以下目录tmp_dir必须在根目录root下。
root = "."
tmp_dir = "tmp" [build]
# 只需要写你平常编译使用的shell命令。也可以使用`make`
# Windows平台示例: cmd = "go build -o tmp\main.exe ."
cmd = "go build -o ./tmp/main ."
# 由`cmd`命令得到的二进制文件名
# Windows平台示例:bin = "tmp\main.exe"
bin = "tmp/main"
# 自定义执行程序的命令,可以添加额外的编译标识例如添加 GIN_MODE=release
# Windows平台示例:full_bin = "tmp\main.exe"
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# 监听扩展名的文件
include_ext = ["go", "tpl", "tmpl", "html"]
# 忽略(不监听)文件的扩展名或目录
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# 监听指定目录的文件
include_dir = []
# 忽略(不监听)指定文件
exclude_file = []
# 忽略符合通过正则匹配到的文件
exclude_regex = ["_test\\.go"]
# 忽略未进行修改的文件
exclude_unchanged = true
# 按照目录的符号链接
follow_symlink = true
# 这个日志文件放在你的`tmp_dir`中
log = "air.log"
# 如果文件更改过于频繁,则没有必要在每次更改时都触发构建。可以设置触发构建的延迟时间/毫秒
delay = 1000 # ms
# 发生构建错误时,停止运行旧的二进制文件
stop_on_error = true
# 杀死进程前发送中断信号(Windows不支持)
send_interrupt = false
# 发送中断信号后延迟时间/毫秒
kill_delay = 500 # ms
# 在运行二进制文件时添加额外的参数 (bin/full_bin)。将运行“./tmp/main hello world”
args_bin = ["hello", "world"] [log]
# 显示日志时间
time = false [color]
# 自定义每个部分的颜色。如果未找到颜色,请使用原始应用程序日志。
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green" [misc]
# 退出时删除 tmp 目录
clean_on_exit = true

至此按照使用方法先执行:air init

然后执行:air

热加载就启动了

调试

运行 air -d 命令能打印所有日志。

遇到 "command not found: air" 或 "No such file or directory"

export GOPATH=$HOME/xxxxx
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export PATH=$PATH:$(go env GOPATH)/bin <---- 请确认这行在您的配置信息中!!!

部署

请注意:这需要 Go 1.16+ ,因为使用 go mod 来管理依赖。

# 1. 先fork项目

# 2. 然后克隆clone下来
mkdir -p $GOPATH/src/github.com/cosmtrek
cd $GOPATH/src/github.com/cosmtrek
git clone git@github.com:<YOUR USERNAME>/air.git # 3. 切换路径安装依赖
cd air
make ci # 4. 这样就可以使用了!
make install

Air实现Go程序的热重载(热加载)的更多相关文章

  1. mysql 5.6 后热数据的加载

    mysql 5.6 后热数据的加载 转自:http://blog.itpub.net/20892230/viewspace-2127469/ 故障现象:在数据库重启后,碰巧遇到业务高峰期,连接数满,导 ...

  2. Unity3d热更新全书-加载(一)从AssetBundle说起

    Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...

  3. tensorflow学习笔记2:c++程序静态链接tensorflow库加载模型文件

    首先需要搞定tensorflow c++库,搜了一遍没有找到现成的包,于是下载tensorflow的源码开始编译: tensorflow的contrib中有一个makefile项目,极大的简化的接下来 ...

  4. 如何在小程序实现图片lazy-load懒加载效果

    自从跳一跳出现之后小程序又开始频繁出现了,在学习过程中发现小程序虽然好但是由于api不完善导致开发过程中有很多的坑,重点是网上相对小程序出现坑时解决方案显然比较少,小程序最让人觉得痛心疾首之一就是无法 ...

  5. 微信小程序中使用ECharts 异步加载数据 实现图表

    <!--pages/bar/index.wxml--> <view class="container"> <ec-canvas id="my ...

  6. 解决WP程序 重复打开出现 “正在加载...” 字样 解决方案

    在开发winphone程序时候 我们经常遇到调试.在调试的时候 可能会重复打开 debug一下.可是有时候 经常遇到 "正在加载...."字样.而且很慢.效率很低. 测试发现 在 ...

  7. 微信小程序 scroll-view 完成上拉加载更多

    我们经常在软件客户端上看到这么一个功能,当我们阅读信息浏览到文章的末尾时,通常会加载出更多的信息.比如,我们在简书客户端上浏览推荐文章时,浏览到屏幕的末尾,此时又加载出了另一页的推荐文章,即实现了上拉 ...

  8. Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

    Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如Mes ...

  9. Android RocooFix热修复动态加载框架介绍

    RocooFix Another hotfix framework 之前的HotFix项目太过简单,也有很多同学用Nuwa遇到很多问题,作者也不再修复,所以重新构建了一套工具. Bugfix 2016 ...

  10. 热更新--动态加载framework

    1.准备工作:先自己封装一个framework:http://www.cnblogs.com/sunjianfei/p/5781863.html 2.把封装好的framework压缩成zip,放到本地 ...

随机推荐

  1. Apache Tomcat AJP 实现负载均衡

    大部分一开始接触WEB服务器的人可能和我一样对为什么有Apache又有Tomcat服务器感到奇怪(它们还都是Apache开发的呵呵),其实他们不是冗余的服务器,虽然他们都能对外提供WEB服务器,但总的 ...

  2. canvas(七)绘制网格和坐标轴

    1.绘制网格 传入dom和分割线间隔进行渲染,网格线分为水平方向和垂直方向 <script> //绘制网格 function drwaGrid(dom = document.querySe ...

  3. JAVA中ScheduledExecutorService的使用方法

    ScheduledExecutorService 简介 ScheduledExecutorService是 Java 中的一个接口,它是ExecutorService的子接口.它主要用于在给定的延迟之 ...

  4. Qt tr 无法翻译

    项目中碰到部分tr无法翻译的问题,最后发现由于继承QObject的子类没有加上Q_OBJECT宏.

  5. 百度地图各种控件:地图平移缩放控件NavigationControl、地图类型控件MapTypeControl

    注:代码复制即可用,标色代码为主要代码 百度地图提供了如下控件: 1.Control:控件的抽象基类,所有控件均继承此类的方法.属性.通过此类您可实现自定义控件. 2.NavigationContro ...

  6. Mplus数据分析:分段潜增长模型,看jama如何玩转纵向数据的轨迹

    今天给大家介绍分段潜增长模型的原理和做法,之前我有给大家写增长混合和潜增长,它们的主要的局限在于轨迹都是连续的不能分段,在于对phasic的现象把握其实还是不够的,比如儿童认知的发展,按照理论,它是可 ...

  7. 从底层源码深入分析Bean的实例化

    生命周期的整体流程 Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. ...

  8. 中电金信:GienTech动态|一波好消息→中标!多领域“开花”

  9. Qt/C++编写全能播放组件(支持ffmpeg2/3/4/5/6/Qt4/5/6)

    一.前言 从代码层面以及自由度来说,用ffmpeg来写全能播放组件是最佳方案(跨平台最好最多.编解码能力最强),尽管已经有优秀的vlc/mpv等方案可以直接用,但是vlc/mpv对标主要是播放器应用层 ...

  10. Qt编写安防视频监控系统44-视频上传

    一.前言 视频上传用来将本地存储的视频文件上传到云端服务器,间接的实现了本地视频存储到云端的功能,其实本质上是先存储在本地,文件生成后再去上传到云端的,最终的效果一样就是,为了拓展兼容性,直接做了单独 ...