需求
项目 test0 需要引用一个 svn 的代码库
这个代码库是一个公司内部的代码库
应该怎么添加
module test0
go 1.16
require (
github.com/gin-gonic/gin v1.7.1
此处需要添加公司内部的svn的代码库
)
解决方式
下面的解决方式是在 go v1.16.5 版本下尝试的
1. test0项目中,引用 svn 代码库地址,使用 replace 的方式,简化路径导入
module test0
go 1.16
require (
github.com/gin-gonic/gin v1.7.1
serverboot v0.0.1
)
replace serverboot => svn.xxx.com/a/b/c/src.svn 666
如上面的 servboot
就是为了引用 svn 代码库
svn.xxx.com/a/b/c/src
是你的svn代码库的 真实地址
svn.xxx.com/a/b/c/src.svn
注意 .svn
后缀,必须添加,为了让go mod 自动使用 svn 的方式去拉取代码,而不是 代理的方式
2. 设置 go 的 环境变量
set GOPROXY=https://goproxy.io,direct
set GOINSECURE=svn.xxx.com
set GOPRIVATE=svn.xxx.com
GOPROXY
添加一个 direct
的值,是为了让 go 如果通过 goproxy.io 拉取不到代码的话, 尝试使用 direct 的方式去拉取。go 是根据 svn.xxx.com/a/b/c/src.svn
这个地址中的后缀 .svn
去确定拉取方式的
Goland 的 go 的代理设置,最好也加上 direct
GOINSECURE
添加代码库的地址svn.xxx.com
,去掉路径,是为了让go拉取代码的时候,不使用安全的方式,比如https。如果不添加,对于svn拉取的时候,会使用 ssh 的方式去拉取。
GOPRIVATE
添加代码库的地址svn.xxx.com
,去掉路径
当设置完,使用一次后,再次看 env ,会发现 这些值也被设置了 :
set GONOSUMDB=svn.xxx.com
set GONOPROXY=svn.xxx.com
3. 然后直接 go build 即可
如果这样改完的话,可能会报
missing go.sum entry
的错误,使用 go mod tidy
执行一下,即可
为什么
https://golang.google.cn/cmd/go/
https://golang.google.cn/ref/mod#go-mod-file
可参照上面的两个官方文档中的相关描述
go mod 是可以通过 默认的代理方式,自定义代理方式,direct 的方式(即通过 .xxx 后缀来识别拉取方式的,比如 .git .svn .hg 等)
如果使用代理的方式,不管是官方代理,还是自定义的代理,都必须实现 GOPROXY 的协议
https://golang.google.cn/cmd/go/#hdr-Remote_import_paths
https://golang.google.cn/ref/mod#goproxy-protocol
然后就是 direct 的方式
direct 方式涉及到的几点内容:
-
怎么确定使用哪种拉取方式 svn? git?
使用路径最后加上 .xxx 的方式 -
svn 可以使用了,那么版本怎么办?
通常情况下,go 使用的都是 规范化的版本,比如 v1.1.1
但是,go 也可以使用非规范化的版本,比如 使用标签,使用分支名,等等,比如上面的 svn 版本 666 ,就是一个非规范化版本
在go mod 下载完导入之后,会发现 项目的 go.mod 中的 非规范化版本,比如 666 ,自动的变成了一个 规范化的版本 v0.0.0-2021111111111111-000000000666
如果想要使用最新版本,666 换成 head 即可
具体可参照 https://golang.google.cn/ref/mod#versions -
版本也可以了,svn 的用户名密码怎么办?
默认的情况下,go 使用本机用户名 ,ssh 的方式 去连接 svn 的机器。
这个很不好处理,后来尝试go get -insecure svn.xxx.com/a/b/c.svn@666
的方式,发现成功了
但是,go 以后版本会 去掉 -insecure 参数,并且,也不好设置这个参数,所以,使用 上述配置 GOINSECURE 变量值的方式
网友评论