go import svn 的代码库

2021-10-28  本文已影响0人  yz08150

需求

项目 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

image.png

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 方式涉及到的几点内容:

  1. 怎么确定使用哪种拉取方式 svn? git?
    使用路径最后加上 .xxx 的方式

  2. 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

  3. 版本也可以了,svn 的用户名密码怎么办?
    默认的情况下,go 使用本机用户名 ,ssh 的方式 去连接 svn 的机器。
    这个很不好处理,后来尝试 go get -insecure svn.xxx.com/a/b/c.svn@666 的方式,发现成功了
    但是,go 以后版本会 去掉 -insecure 参数,并且,也不好设置这个参数,所以,使用 上述配置 GOINSECURE 变量值的方式

上一篇 下一篇

猜你喜欢

热点阅读