使用go.mod依赖第三方库时,有以下要求:
- 代码仓库托管于VCS(版本控制系统);
- 代码仓库是公开的;
- 仓库地址使用域名访问;
- 仓库域名支持HTTPS访问。
对于自己或者公司内部搭建的私有git,这些条件是比较难同时满足的,本文我们就来看看这些条件不满足时,该怎么办?
这个问题其实分两种情况来看,如果你自己的仓库是一个"正规"的仓库,使用域名访问,不带端口,通过HTTPS访问,唯一的区别是你的仓库是私有的。这种情况下,只需要设置一下 GOPRIVATE
环境变量就可以了,值是你的仓库域名,可以带路径。托管于GitHub上的私有仓库也可以依此设置。比如你的仓库域名是 myrepo.com
,按如下设置环境变量即可:
GOPRIVATE=myrepo.com
如果你只有某个组下的仓库是私有的,可以通过路径指定,多个域名通过逗号分隔。
GOPRIVATE=myrepo.com/mygroup,myrepo.com/yourgroup
接下来就是比较复杂的情况,比如仓库是非标的,通过IP地址访问,或者需要带端口访问,还有只能通过HTTP访问等。这种情况下我们就需要对git下手了,因为 go get
最后还是会用到git来下载包。
第一步我们需要用一个标准仓库域名来充当门面,配置命令如下:
git config --global url."http://myrepo.com:8080/".insteadof "https://gitea.com/"
上面的命令会修改 C:\Users\kaka\.gitconfig
文件,给你加上下面的配置:
[url "http://myrepo.com:8080/"]
insteadof = https://gitea.com/
当然,你也可以手动修改这个文件,加上上面的配置,再者可以在执行配置命令前后对比下这个文件的变化。这样,当我们访问gitea.com的时候,实际上会访问到myrepo.com:8080,而且从协议从HTTPS换到了HTTP。经过上面的偷梁换柱,我们已经做到了瞒天过海。
需要注意的是, insteadof
后面的域名要是一个"正规"的版本控制仓库。因为go在下载代码之前首先会通过 https://gitea.com/repo/test?go-get=1
获取信息,注意最后的 ?go-get=1
,正常情况下它的响应如下:
html
<!doctype html>
<html>
<head>
<meta name="go-import" content="gitea.com/repo/test git https://gitea.com/repo/test.git">
<meta name="go-source"
content="gitea.com/repo/test _ https://gitea.com/repo/test/src/branch/main{/dir} https://gitea.com/repo/test/src/branch/main{/dir}/{file}#L{line}">
</head>
<body>
go get gitea.com/repo/test
</body>
</html>
看到body中的内容了吗,这就是真正的代码获取地址。
如果仓库是私有的,那么我们还是需要配置 GOPRIVATE
环境变量。只不过这次我们要配置的域名是 insteadof
后面的域名,在我们的例子中应该配置 GOPRIVATE=gitea.com
。
第三步我们需要去修改 go.mod
文件,将包名中的域名换成 insteadof
后面的域名,此例中是 gitea.com
。
最后一步,在你的仓库中发布一个release,这样就可以在其他go项目中正常引入自己那非标仓库里的包了。
最后的最后,如果你使用的是GoLand或者IDEA,这类IDE好像有自己的环境变量机制,直接修改系统环境变量有时候不会生效,你需要在IDE里面设置或者在它的命令行通过 go env -w GOPRIVATE=gitea.com
这样的方式来设置。