dokcer+airx+go本地开发

272 阅读2分钟

为什么这么做

  1. 不同项目需要使用不同的go版本开发
  2. air是用于监听文件变化,用于本地开实时调试,免去不断重复 go run xxx

原理是什么

使用 docker 不同版本的 go 打包可执行文件并且执行

事先准备

  1. docker 已经安装完成
  2. 你需要的各个版本的 golang 镜像
  3. 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

image.png

到了这里,其实我们就相当于在本地安装了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

image.png

你要是觉得麻烦,你甚至可以把这个命令协程一个简单的全局命令

接下来就是开发了,要切换版本你就自己造就行了,命令啥的自己随便写shell就能搞定了