通常我们见到的Golang库地址都是其他人所写的,并且托管在 http://github.com,http://golang.org等平台下,如果我们自己想模块化一些封装库,并且想用中国自己的 http://gitee.com托管,需要注意以下几点:
1. go mod init
这个命令用来初始化go mod的,一般创建工程第一步就是执行这个命令,这时候就要提前规划好自己库的托管平台和最终的git地址,如果希望托管到http://gitee.com平台,需要初始化合适的包名,比如:
go mod init gitee.com/newflydd/gmorm
所以,创建工程的第一步并不是那么随意,需要跟最后一步提交工程到托管平台相互呼应,当然,你还可以go mod init
之后再去修改go.mod
文件,设置合适的模块名称。
如果最终发布的URL与go.sum
中的模块名不一致,则别人使用go get
时,会发生错误,比如提示:
go get: gitee.com/newflydd/gmorm@v0.1.3: parsing go.mod: module declares its path as: gmorm but was required as: gitee.com/newflydd/gmorm
2. git tag
每个合法的golang库的git地址,需要配置一个git tag,这个tag的名称也不允许乱起,一定要是一个合法的版本名称,使用git tag
命令在最后一次commit的版本上打上tag
,比如执行以下命令:
git add . git commit -m "test" git tag v0.1.0 git push --tags
3. go get
git push
到仓库后,解下来就是在另外的工程中使用go get
引入这个模块了。要注意的是,目前go get
的版本有点神奇,你最好关注一下环境变量GOPROXY
,我这边测试下来,即使GOPROXY
不设置任何值,它依然会首先搜索https://proxy.golang.org/gitee.com/newflydd/gmorm/@v/list
这种代理库地址,显然我们没有必要去这些乱七八糟的平台都注册一遍自己的库,只想静静地封装自己的模块,让自己和其他朋友以后的工程能够自由引入和调用。
这里要设置GOPRIVATE
环境变量,让go get
的时候,对一些特定的库不要使用代理,直接去我们指定的URL下载,也不要去校验sum值,比如执行:
export GOPRIVATE=gitee.com
这里再提一句,`go get`一旦发现`https://proxy.golang.org/gitee.com/newflydd/gmorm`代理中没有收录你的库,会直接报错,甚至都不会去你指定的URL上去下载,我怀疑是不是在不指定`GOPROXY`时,会有一个默认值`GOPROXY=proxy.golang.org,direct`,一旦报错就中止,这也太扯了。
如果在执行`go get`命令之前,强制一个`export GOPROXY=direct`,就可以直接去指定地址下载库了,但是后面还是提示sum校验不正确,所以仍然是要设置`GOPRIVATE`环境变量。
Golang似乎是希望使用这种方式增加引入第三方库的安全性,毕竟之前出现过开源项目翻车的案例。
4. git config
我们知道git clone包括go get的背后,都是使用https去下载的。我发现,即使把项目开源,但有时候也会提示需要用户名密码或者提示权限问题,网上说这是因为https的问题。
这时候需要指定这些库不使用https下载,而使用ssh下载,比如执行以下命令:
git config --global url."git@gitee.com:".insteadOf "https://gitee.com/" cat ~/.gitconfig