Go 应用热重启 - Live Reloading

Last Modified: 2023/08/11

概述

在开发 Vue/React 之类的 app 时,我们一边编写页面代码,一边在浏览器中就可以实时看到页面跟着发生变化,而且这个过程无需我们主动刷新页面。这是由于 Vue/React 之类的框架支持一种被称为热加载(hot reloading)的功能,这让我们的开发效率得到大幅提升。本文将介绍在 Go 语言开发中,几个常用的可实现类似功能的库。

注:本文将会混用 Live Reload 和 热重启,他们表达相同的含义。

Live Reloading vs Hot Reloading

Live Reloading 我将其翻译成热重启,热重启需要重启才能应用代码的改变,但重启不需要你手动完成,而是由工具代替你自动完成应用重启。

热加载可以在程序运行过程中随时应用最新的代码改动,整个过程无需重启应用。因此这种方式效率更高,而且还能保持应用的状态。举个例子,你将页面向下滚动了页面 20px,热加载之后,页面还保持在你上次滚动到的位置。

热加载更先进,但实现起来更难,在 Go 开发中,还无法实现热加载,但好在有不少库已经实现了热重启,接下来将推荐两个库供大家参考,大家可以根据需要使用其中之一即可。

热重启框架 Air

Air 的安装和使用相当简单,go1.18 以上直接使用 go install 安装:

go install github.com/cosmtrek/air@latest

go1.18 以前可以使用 shell 脚本安装,对 windows 用户不太友好,方法如下:

# 使用这种方式会将 air 安装到当前目录下的 bin 目录下
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s

安装完成之后,使用方法如下:

首先进入项目根目录,执行 air init,该命令会在根目录下生成配置文件 .air.toml,该文件是 air 的配置文件,但是大部分情况下什么也不用配置,最后在项目根目录下执行:

air

Air 的工作原理很简单,总结一下就是利用 fsnotify 监控文件变化,如果文件有变化,重新编译项目,编译完成后,停止老的程序,并自动运行刚刚编译的新程序。

想象一下,如果没有 air,你改动一个文件后想要查看改动后的效果,你需要停止程序,然后再启动程序,不停的改,不停的重复这个过程,相当费时费力,有了 air 之后,这个过程就自动化了。

截止目前,Air 也有一些小毛病,例如,air 不支持从程序从标准输入接收用户输入,Arelo 就没有这个问题。总体来讲,air 的使用还是相当简单的。

热重启框架 Arelo

Arelo 是另外一个可以实现 Live Reload,虽然在 github 上 star 数量远不及 air,它还解决了 air 不能从标准输入接收用户输入的问题。

Arelo 安装:

go install github.com/makiuchi-d/arelo@latest

Arelo 是个纯纯的命令行工具,不需要任何配置文件,使用方法如下:

arelo -p '**/*.go' -i '**/.*' -i '**/*_test.go' -- go run .
  • -p 用于指定监控的文件,支持 glob 写法,如果被监控的文件有改动,则会重新启动 -- 后面的命令;
  • -i 用于忽略指定的文件,例如测试文件的改一般不需要重启应用,所以我们可以忽略以 _test.go 为后缀的文件;
  • -- 后面是需要 arelo 帮我们自动重启的命令,也就是说如果监控的文件有变化,alelo 会帮我们自动重新运行该命令。

alelo 还提供了一些其他的命令行参数,可以视情况使用:

Usage: arelo [OPTION]... -- COMMAND
Run the COMMAND and restart when a file matches the pattern has been modified.

Options:
-d, --delay duration duration to delay the restart of the command (default 1s)
-h, --help display this message
-i, --ignore glob ignore pathname glob pattern
-p, --pattern glob trigger pathname glob pattern (default "**")
-r, --restart restart the command on exit
-s, --signal signal signal used to stop the command (default "SIGTERM")
-t, --target path observation target path (default "./")
-v, --verbose verbose output
-V, --version display version

Live Reload 总结

Go Live Reload 可以帮我们自动监控文件变化,自动重启应用,可以极大的提高开发效率,职场如战场,兄弟们卷起来吧。。。

有问题吗?点此反馈!

温馨提示:反馈需要登录