Zoe

Zoe

beta
实验项目

返回到博客

搭建自己的 Go mod 仓库

Zoe

Zoe

2019-09-01

1 MINS

最早在接触到自定义域名的Go包是Uber的go.uber.org/zap,当时感觉很酷。 这种包的方式有几个优点:

  • 包名短,易于使用
  • 品牌(装B)标识,很酷

所以最近研究了下,准备自己搭建一个类似的自己的域名的Go仓库: go.zoe.im

原理#

go get在获取包时,会向将包名作为URL发送https的的GET请求, 然后解析响应HTML内容中Meta元素go-importgo-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中方案,

  1. HTTP server 动态返回
  2. HTML static 内容托管

serverstatic2中方式的优缺点都很明显,

方案优点缺点
server1. 无需管理包1. 需要部署和维护服务
static1. 部署简单无需服务器1. 需要手动添加包

对于这2中方案都不复杂也无需做取舍,都实现一下,用户按需使用即可。

给他取个名字叫做gopkg好了。 定义配置文件如下,

1name: Zoe's golang packages
2description: Zoe's golang packages
3metadata:
4host: go.zoe.im
5base:
6theme:
7packages:
8- name: gopkg
9 type: git
10 schema: https
11 path: github.com/jiusanzhou/gopkg
12- name: x
13 path: github.com/jiusanzhou/x
14 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 packages
2description: Zoe's golang packages
3host: go.zoe.im
4packages:
5- name: gopkg
6 path: github.com/jiusanzhou/gopkg
7 sub:
8 - name: cmd
9- name: knife-go
10 path: github.com/jiusanzhou/knife-go
11 sub:
12 - name: config
13 - name: config/options
14 - name: convert
15 - name: pool
16 - name: util
17- name: x
18 path: github.com/jiusanzhou/x
19 sub:
20 - name: sh
21 - name: cli
22 - name: cli/opts
23 - name: httputil
24- name: surferua
25 path: github.com/jiusanzhou/surferua
26- name: injgo
27 path: github.com/jiusanzhou/injgo
28 sub:
29 - name: cmd/injgo
30 - name: pkg/w32
31- name: unipaw
32 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.ymlgopkg.yaml


排查集群的一些问题
Deployment 可控的滚动升级实现

Zoe

Zoe

beta

我将成为我的墓志铭

站点

© 2011 - 2022 Zoe - All rights reserved.

Made with by in Hangzhou.