一、简介
公司项目使用 go module 开发的过程中会有一些自己的库要引用,这些库用gitlab管理,需要研究引用gitlab库的方法,下面是研究过程中的一些经验。
介绍两种引用方案:
- 1、引用本地目录
- 2、引用合规地址库
- 3、引用私有不合规库
- 4、恶心至极的私有不合规库
上述名词中的 合规 是指:
- [x] 库的地址是通过域名方式访问
- [x] 支持HTTPS
- [x] 库的地址通过 80 和 443 端口,而不是其它端口
满足上述条件即是 合规库,否则是 不合规库,由于通常不合规库都是私有的,这里直接叫 私有不合规库。 其中,违反第3点的最为恶心(官方不支持,给官方提需求的同时,不得不吐槽这种情况太恶心了)。
注意:本文撰写于 2020年7月3日,go版本 1.14.4,到撰写日为止内容真实有效,均经过本人验证。
二、引用本地目录
修改文件 go.mod:
module main
go 1.14
// 替换规则
replace (
github.com/pborman/uuid => /data/go-packages/uuid v1.2.0 // 绝对路径 或 相对路径 都可以
)
// 源地址
require (
github.com/pborman/uuid v1.2.0
)
默认使用 github.com/pborman/uuid
包会到 Github 上去下载,但这个包还在本地开发中并未push到线上,那么可以通过 replace
配置来重定向当前项目对该包的加载路径:
github.com/pborman/uuid => /data/go-packages/uuid
这里 /data/go-packages/uuid
为本地包的绝对路径,这样写就可以了,当本地 uuid
包代码修改后就可以在当前项目看到实时效果了,注意中间符号是 =>
配置好以后正常拉取代码、编译、调试。
二、引用合规库
与 引用本地目录类似,修改文件 go.mod:
module main
go 1.14
// 替换规则
replace (
github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 开源中国地址
)
// 源地址
require (
github.com/pborman/uuid v1.2.0
)
接下来正常拉取代码、编译、调试。
三、引用私有不合规库
这里我们介绍第二种情况
3.1、配置仓库访问权限
有以下两种授权方式:
-
1、访问令牌(Access Token)
通过在gitlab生成个人的“访问令牌”,并在拉取git仓库的机器上配置Token来实现访问仓库。
通常是在这个地址:https://{{gitlab_url}}/profile/personal_access_tokens
{{gitlab_url}}
是gitlab地址 -
2、SSH秘钥(SSH Key) 【推荐】
通过在gitlab的 个人账户 或者 仓库 下面配置 SSH秘钥,来实现客户端访问仓库。
注意:这种方式高效、简单,只要保证本地
.ssh
目录下存在相应的秘钥对即可。
3.2、本地配置“访问令牌(Access Token)”参数
"ssh密钥"授权忽略本节
对本项目生效:
git config http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"
对所有git项目生效:
git config --global http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"
注:根据需求任意选择上面一个配置即可
3.3、配置使用git方式拉取代码
git config --global url."git@{{gitlab_url}}:groupName/projectName.git".insteadOf "https://{{gitlab_url}}/groupName/projectName.git"`
也可以直接全局替换,那么可以拉取域名下的所有包,如:
git config --global url."git@{{gitlab_url}}:".insteadof "https://{{gitlab_url}}/"
上面是通过命令修改配置,也可以像这样,直接修改配置文件 ~/.gitconfig
,在里面添加如下配置:
[url "git@{{gitlab_url}}:"]
insteadOf = https://{{gitlab_url}}/
注意:
insteadof 中的参数是 https,因为不管目标地址是http还是https,go get默认使用https方式访问,因此我们要强制将https转换成git协议。
五、恶心至极的私有不合规库
为什么会有恶心至极的私有不合规库?这种库有什么特点?
这种库把合规库所有的标准践踏一遍,也就是说它违反了每一条规则:
- 1、ip访问
- 2、端口非80、443
- 3、没有证书
其中第3点并不重要,第2点是产生这种情况的根源。
这种情况下,我们要:
-
1、结合 “三、引用私有不合规库”
-
2、在
go.mod
和 git config 中配置别名(映射)通过两次别名,重定向到
IP:Port
。-
2.1、在
go.mod
中配置地址别名,该别名必须是真实有效的 HTTPS 地址go.mod
配置:module main go 1.14 // 替换规则 replace ( github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 第一次别名地址,地址真是有效,并且是HTTPS ) // 源地址 require ( github.com/pborman/uuid v1.2.0 )
-
2.2、在 git config 中再次配置别名,将
go.mod
中的别名指向真正的地址git config --global url."git@192.168.102.73:CloudComputing/Cloud-Fundamation/Operation-Center".insteadof "https://gitee.com/gober"
-
参考资料及附录
- Golang使用go.mod配置加载本地模块
- Go填坑之将Private仓库用作module依赖
- go module,使用gitlab私有仓库作为项目的依赖包 2019.01.22 01:05:14
- gitlab 项目支持 go module 2019-07-15 20:10:06
本文由 qingchuwudi 译制或原创,除非另有声明,在不与原著版权冲突的前提下,本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。