简介:

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或.zshrc:alias 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. Java中private方法能重写吗?

    问题:Java中private方法能重写吗? 下面是测试代码 public class A { private void print() { System.out.println("A&qu ...

  2. Java反编译器剖析

    本文由 ImportNew - 邬柏 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. Importnew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的Jav ...

  3. 缓存之ehcache 之使用

    1. EHCache 的特点,是一个纯Java ,过程中(也可以理解成插入式)缓存实现,单独安装Ehcache ,需把ehcache-X.X.jar 和相关类库方到classpath中.如项目已安装了 ...

  4. spring 使用异步任务

    1.说明 在springboot 中使用 @Async 实现异步任务处理,下面介绍一下如何实现这个. 2.实现代码 2.1 增加@EnableAsync @EnableAsync public cla ...

  5. 网站动静加速架构 dcdn+ga 全站加速和全球加速api

    背景: 1,公司服务全部在香港 2,所有的服务也都在香港 3,但是我们的客户都在国内 4,那么国内用户访问香港的服务 那么就会存在慢的问题 至于为什么不放到国内,因为我们公司是做nft的.所以你懂得. ...

  6. 中电金信成为开源风险评估与治理技术实验室软件物料清单(SBOM)工作组成员单位

    近期,中电金信成功加入国家工业信息安全发展研究中心开源风险评估与治理技术实验室软件物料清单(SBOM)工作组,成为其成员单位,并同步加入"筑链计划"之中. SBOM是Softwar ...

  7. k3s 轻量级Kubernetes 安装实例

    k3s是由Rancher开发的轻量级Kubernetes,支持嵌入式系统,边缘计算节点等 易于安装,所有组件都在一个小于100MB的二进制文件中,占用资源低 1.1.简单安装试例 curl -sfL ...

  8. 会话丢失-NGINX配置之underscores_in_headers

    1.描述问题NGINX代理某个web服务时,单机情况下也出现不停的要求认证的情况 初步分析去掉NGINX代理,直接访问服务,未出现上述情况: 进一步分析:查看经过NGINX的请求和直接访问服务请求区别 ...

  9. tar/zip命令加密压缩

    回到顶部 场景 Centos6下使用加密压缩,可以从A机器到B机器解压. 可用在kali上解压就不行. 回到顶部 命令 解包 tar zxvf FileName.tar 打包 tar czvf Fil ...

  10. Qt开发经验小技巧201-205

    编译生成debug版本动态库,文件末尾自动加上d结尾. CONFIG(debug, debug|release) { win32: TARGET = $$join(TARGET,,,d) mac: T ...