测试环境为了方便管理一直未直接在系统安装golang,编译项目是使用官方的golang镜像。但是编译速度很慢,和本地开发环境不一样,本地几秒,测试服务器用镜像编译需要至少1分钟。为了解决这个问题,我进行了一些研究。

golang为了加速编译,会保存编译的中间结果下次直接使用,比如框架,标准库,这些都是不会变的编译成本。保存下来下次直接使用可以加速编译。go env命令中的GOCACHE环境变量就是用来保存编译中间结果的路径。

获取GOCACHE路径

我目前使用的编译镜像是golang:1.18-bullseye。使用docker run -itd golang:1.18-bullseye sh命令创建一个容器。

进入容器shell。

# go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_arm64"
GOVCS=""
GOVERSION="go1.18.10"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1339762486=/tmp/go-build -gno-record-gcc-switches"

我们发现GOCACHE中默认配置的路径是/root/.cache/go-build

修改编译脚本

在编译脚本中映射这个目录到项目目录中。

docker run --rm \
  -v "${ROOT}/:/go" \
  -v "${ROOT}/docker_work/go-build:/root/.cache/go-build" \
  -w /go golang:1.18-bullseye bash ${SHELL_DIR_NAME}/build.sh "cmd/http/server.go" "${WORK_DIR_NAME}/${BUILD_TARGET_NAME}" "${TAG_DATA}"

验证

➜ docker run --rm \
    -v "${PWD}/:/go" \
    -v "/Users/yusen3/GOCACHE:/root/.cache/go-build" \
    -w /go golang:1.18-bullseye bash docker/build.sh cmd/http/server.go go_program/server
2023-02-07 11:20:28
#### Go Build binary code ####
#### Copy config ####
#### Copy templates ####
#### Copy sh ####
#### Go Build success ####
2023-02-07 11:21:20
➜ docker run --rm \
    -v "${PWD}/:/go" \
    -v "/Users/yusen3/GOCACHE:/root/.cache/go-build" \
    -w /go golang:1.18-bullseye bash docker/build.sh cmd/http/server.go go_program/server2
2023-02-07 11:22:02
#### Go Build binary code ####
#### Copy config ####
#### Copy templates ####
#### Copy sh ####
#### Go Build success ####
2023-02-07 11:22:20

看了一眼前后时间,设置路径之后,GOCACHE目录是空的时候编译要接近1分钟,下一次编译耗时就变成了18s,说明通过映射目录加速编译是生效的。

最后修改:2023 年 02 月 08 日
如果觉得我的文章对你有用,请随意赞赏