返回到博客
搭建自己的 Go mod 仓库
最早在接触到自定义域名的Go包是Uber的go.uber.org/zap
,当时感觉很酷。
这种包的方式有几个优点:
- 包名短,易于使用
- 品牌(装B)标识,很酷
所以最近研究了下,准备自己搭建一个类似的自己的域名的Go仓库: go.zoe.im
。
原理#
go get
在获取包时,会向将包名作为URL发送https
的的GET
请求,
然后解析响应HTML内容中Meta元素go-import
和go-source
。
例如,
1<!DOCTYPE html>2<html>3 <head>4 <meta name="go-import" content="go.zoe.im/x git https://github.com/jiusanzhou/x" />5 <meta name="go-source" content="go.zoe.im/x https://github.com/jiusanzhou/x https://github.com/jiusanzhou/x/tree/master{/dir} https://github.com/jiusanzhou/x/tree/master{/dir}/{file}#L{line}">6 <meta http-equiv="refresh" content="0; url=https://github.com/jiusanzhou/x">7 </head>8 <body>9 Nothing to see here. Please <a href="https://github.com/jiusanzhou/x">move along</a>.10 </body>11</html>
go-import
的内容为<包名> <scm> <scm_url>
。
所以代码依然还是托管在Github上。只不过,包名换成了自己的域名。
实现#
想实现上诉的HTML内容返回,我们可以有2中方案,
- HTTP server 动态返回
- HTML static 内容托管
server
和static
2中方式的优缺点都很明显,
方案 | 优点 | 缺点 |
---|---|---|
server | 1. 无需管理包 | 1. 需要部署和维护服务 |
static | 1. 部署简单无需服务器 | 1. 需要手动添加包 |
对于这2中方案都不复杂也无需做取舍,都实现一下,用户按需使用即可。
给他取个名字叫做gopkg
好了。
定义配置文件如下,
1name: Zoe's golang packages2description: Zoe's golang packages3metadata:4host: go.zoe.im5base:6theme:7packages:8- name: gopkg9 type: git10 schema: https11 path: github.com/jiusanzhou/gopkg12- name: x13 path: github.com/jiusanzhou/x14 sub:15 - name: cli
代码实现很简单,基本上围绕这个配置来展开生成HTML文件了。
注意,当前没有实现
server
完整的代码可以查看gopkg仓库。
实际使用#
为了确保服务长期使用的稳定,我使用静态文件的形式。这样我只需要定期给DNS续费就可以了。
我将我自己使用go.zoe.im
托管在go.zoe.im仓库。
先在master
分支上添加一个CNAME
文件,内容为go.zoe.im
,并做好正确的DNS解析。
如果,我需要添加库,只需修改master
分支下的gopkg.yaml
文件,
下面是我现在全部库的配置,
1name: Zoe's golang packages2description: Zoe's golang packages3host: go.zoe.im4packages:5- name: gopkg6 path: github.com/jiusanzhou/gopkg7 sub:8 - name: cmd9- name: knife-go10 path: github.com/jiusanzhou/knife-go11 sub:12 - name: config13 - name: config/options14 - name: convert15 - name: pool16 - name: util17- name: x18 path: github.com/jiusanzhou/x19 sub:20 - name: sh21 - name: cli22 - name: cli/opts23 - name: httputil24- name: surferua25 path: github.com/jiusanzhou/surferua26- name: injgo27 path: github.com/jiusanzhou/injgo28 sub:29 - name: cmd/injgo30 - name: pkg/w3231- name: unipaw32 path: github.com/jiusanzhou/unipaw
Github的Action会自动运行gopkg gen
来生成,所以的HTML内容,并推送到gh-pages
分支。
然后就可以使用了。比如,我需要安装go.zoe.im/x
库,像这样子就可以啦。
1go get go.zoe.im/x
如果你也想自己搭建一个类似的,你可以参考,go.zoe.im仓库中的.github/workflows/main.yml
和gopkg.yaml
。