go mod 使用指南

环境准备

版本要求 golang version >=1.11

打开go mod;

export GO111MODULE=on

设置代理

export GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct

设私仓库,不走代理,不计go.sum检验(没有私有仓库跳过此步骤)

 export GOPRIVATE=www.mukebb.cn/*

go get支持 git clone 时用 git@xxx(即ssh)

git config --global url."[email protected]:".insteadOf "https://www.mukebb.cn/"

$> cd `$工程根目录`
$> go mod init     # 生成空白 go.mod/go.sum 2个文件
$> go mod tidy     # 填充 go.mod、go.sum 文件。

> # 使用go run/build时, 会自动go get下载模块源码到: $GOPATH/pkg/mod/

> $ ls $GOPATH/pkg/mod/
> cache/       golang.org/  honnef.co/            mvdan.cc/
> github.com/  gopkg.in/    mukebb.cn/kgo/'[email protected]'/

PS: go 编译寻找依赖包顺序: {$工程}/ -> $GOPATH/ --> $GOROOT/。

执行 go mod vendor 会把所有依赖包 下载或copy到{$工程}/vendor/ 目录下。

执行 go build -mod=vendor # 可以支持先 从 {$工程}/vendor/ 查找包编译。

go.mod 文件结构/语法

module mukebb.cn/mgo-demo

go 1.13

require (
	github.com/kshvakov/clickhouse v1.4.0
	mukebb.cn/mgo/log v0.0.1
	mukebb.cn/msa/msa_common v1.0.0 // indirect
)

replace gopkg.in/redis.v5 v5.2.9 => mukebb.cn/mgo/gopkg.in/redis.v5 v0.0.0-20200629065457-d5a7ea1e7745
  • require 必需库,自动go get 下载,编译时从 pkg/mod 中查找。
  • replace 源码import时会被后者代替。 第1次手工写replace时,后者版本写latest 。
  • exclude 语句可以排除指定依赖包。 还没想到场景,可用于减少编译文件大小?

第3方库安全、拉取、版本一致问题

公共代码引用

replace mukebb.cn/lib => mukebb.cn/cloud/lib latest # 或用branch、tags,

原来我们大量第三方库放在 mukebb.cn/cloud/lib/Godeps/_workspace/src

才有了设2个 GOPATH路径的事。 export GOTPATH=A:A/src/mukebb.cn/lib/Godeps/_workspace/

第3方库安全拉取

自建私有库,不同工程自行打上tags,br到工程的go.mod

为啥要用go mod

  • 官方选的-行规。
  • go.mod/go.sum 清晰工程依赖了啥。
  • 包的管理(下载、版本、缓存)方式统一(存放);
  • 本地可以存放某个库,多个版本、或分支,按工程依赖执行编译。
  • 拉取可用proxy,可作 replace。
  • 【坏处or好处】 3rd-vendor 大仓还是跑不了。

实践

  • import “mukebb.cn/lib” 改成 import “mukebb.cn/cloud/lib” # 平台大仓
    建大仓: mukebb.cn/cloud/vendor 存第3方代码(如github.com、等流派),全司分开读。
    push 到vendor仓库的代码,都要加上tags 标识版本,这样同一个代码,就可以有多版本共存。
    两个大仓: cloud/lib + cloud/vendor 。 我们 子工程代码,都要取下来。可用写 replace
    replace mukebb.cn/lib => mukebb.cn/cloud/lib latest
    replace github.com/abc => mukebb.cn/cloud/vendor/github.com/abc @v0.0.1
    旧工程改造:
    go mod init # 写 replace
    增加 Dockerfile, 写上 编译构建 指令,如下:
#  构建 的Dockerfile 例子 
FROM golang:1.13.10 as builder
WORKDIR /build
#COPY . .
ADD devops-mkbb ./mkbb
ADD devops-mkbbvendor ./mkbb/vendor
RUN CGO_ENABLED=0 cd ./mkbb/ && go build -mod=vendor -o mkbb-web cmd/web/main.go

FROM khub.mkbb.cn/mkopen/mk-base:latest as runner
LABEL description="mkbb-web"
WORKDIR /opt/apps/devops-mkbb
RUN mkdir -p /etc/mkbb /data/logs/{mkbb,nginx} /opt/apps/devops-mkbb/{bin,etc,nginx}

EXPOSE 80
ENTRYPOINT ["/opt/apps/devops-kae/start.sh"]

你可能感兴趣的:(go)