为什么这么做
- 不同项目需要使用不同的go版本开发
air是用于监听文件变化,用于本地开实时调试,免去不断重复go run xxx
原理是什么
使用 docker 不同版本的 go 打包可执行文件并且执行
事先准备
docker已经安装完成- 你需要的各个版本的
golang镜像 air软件安装完成(我这里是用于监听本机文件,不是 docker image 实例中的文件变化 当然你也可以这么干)
docker 命令
docker run --rm \
-u $UID:$UID \
-e XDG_CACHE_HOME="/tmp/.cache" \
-e GOPROXY="https://goproxy.cn,direct" \
-e GO111MODULE=on \
-e GOARCH=arm64\
-e GOOS=darwin \
-v $PWD:/srv/app \
-v $HOME/docker/gotmp:/go \
-w /srv/app \
golang:1.18.3-stretch go $@
-u 用户为当前宿主机用户
-e
XDG_CACHE_HOME 缓存是测试内容、环境变量和命令行参数的哈希。一旦计算出来,这个缓存会转储到$GOCACHE指向的文件夹(Unix 系统下默认是$XDG_CACHE_HOME或$HOME/.cache)。清空这个文件夹也就会清空缓存。
GOARCH, GOOS 填宿主机的系统信息
-v $HOME/docker/gotmp:/go 这个主要是用于go各种包的缓存,下次执行不用重新 download
golang:1.18.3-stretch 你的go实例名称
$@ 表示 shell 中除第0个以后的所有参数
例如上述中我使用 go1.8 我将上述命令存储成 go18 可执行命令, 怎么变成可执行文件并且在全局调用,我这里就不做解释了
➜ go18 version
go version go1.18.3 linux/arm64
到了这里,其实我们就相当于在本地安装了go,区别就在于名字不一样而已,那剩下的也就和本地开发中使用air 一样了
air配置
vim air.toml
root = "."
tmp_dir = "tmp"
[build]
cmd = "go18 build -gcflags="all=-N -l" -o ./tmp/main ." # 执行打包
bin = "tmp/main" # 启动程序
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
include_ext = ["go", "tpl", "tmpl", "html"] # 监听文件后缀
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules", "doc"] # 排除目录
include_dir = []
exclude_file = []
log = "air.log"
delay = 1000 # ms
stop_on_error = true
send_interrupt = false
kill_delay = 500 # ms
[log]
time = false
[color]
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"
[misc]
clean_on_exit = true # 退出时删除临时目录
此时,切换到你的项目目录
cd ~/go/work/project
air -c /your dir/air.toml
你要是觉得麻烦,你甚至可以把这个命令协程一个简单的全局命令
接下来就是开发了,要切换版本你就自己造就行了,命令啥的自己随便写shell就能搞定了