0%

go module使用之拉取私有包仓库

拉取非公共module

通过 Go 命令拉取项目依赖的公共 Go Module,只需要在每个开发机上设置环境变量 GOPROXY,配置一个高效且可靠的公共 GOPROXY 服务,如 set GOPROXY=https://goproxy.cn,direct。但是如果同时需要拉取私有的包怎么办呢?如企业自己开发的module依赖。这时我们需要配置set GOPRIVATE=*gitee.com,表示 gitee.com的包不使用代理而是直接拉取。通过go env命令可以看出:

set GONOPROXY=*gitee.com
set GONOSUMDB=*gitee.com
set GOPRIVATE=*gitee.com

开发私有module

  1. 如我们开发一个打印版本的方法,封装在了gitee.com/happywzy/go-module-test包中。
package pkg

func Version() string {
    return "version 1"
}

我们模拟提交了很多个版本,并在不同的commit打上了一些tag,提交到了远程仓库。

# 查看版本号
> git ls-remote -q origin          
9da810c37c774a3775a518d16cfe032a39f862ea        HEAD
9da810c37c774a3775a518d16cfe032a39f862ea        refs/heads/master
9da810c37c774a3775a518d16cfe032a39f862ea        refs/tags/v1.0.0
f4c3585328e0a686ad35537e390473917c4b202b        refs/tags/v1.0.0-test
1e40db9baf18cbb8ed5784858bc9418c738792a7        refs/tags/v2
  1. 我们需要在另一个Module中使用Version()方法
    go.mod配置如下:
module gitee.com/happywzy/go-module

go 1.19

require (
    gitee.com/happywzy/go-module-test v1.0.0-test
)
  • 版本号可以配置成commitId,执行go mod tidy后,会根据commitId自动生成伪版本号,如gitee.com/happywzy/go-module-test v0.0.0-20240524023550-1e40db9baf18,这个版本号不要手敲,防止出错。
  • 版本号可以配置成tag,如v1.0.0v1.0.0-test,但是配置成v2这种好像无法识别。
  • 可以通过go get 命令去安装module,如 go get gitee.com/happywzy/go-module-test@master@后面可以是分支名、tag名、commit ID,非常方便。

如何使用本地的Module

前面介绍的方式需要Module推送到远程仓库后才能使用,这在开发阶段非常不适用,如何直接使用本地的Module呢?有两种方式。

  1. 使用 go.mod 中 replace
replace (
    gitee.com/happywzy/go-module-test v1.0.0-test => ../../happywzy/go-module-test
)

表示gitee.com/happywzy/go-module-test v1.0.0-test这个包直接使用本地路径下的代码。这种方式需要注意在提交代码前需要将replace删除,防止出错。

  1. 使用 go.work

    go.work1.18 版本之后才有。

go 1.19

use (
    ./happywzy/go-module-test
    ./happywzy/go-module
)

go.work文件需要位于两个模块的上层目录,通过go work init初始化生成,使用go work use gitee.com/happywzy/go-module-test添加。

go.work 这个文件无需提交到git,仅用于本地开发即可。