当前位置:首页 > CN2资讯 > 正文内容

没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径

3天前CN2资讯

我们见到的Go包的导入路径常常以、bitbucket.org等代码托管站点的域名为前缀,这样的包导入路径有一个问题,那就是当Go包的托管站点发生变更时(比如从迁移到bitbucket.org或gitlab.com),该包的使用者需要更新包的导入路径。当然,在支持go module+GOPROXY的情况下,如果使用者不再升级包版本,他/她完全可以继续使用原包导入路径,但这仅是特例。

还有一些包的导入路径并非以知名代码托管站点域名作为前缀,比如:Go官方扩展包text,它的包导入路径是/x/text,这种包导入路径被称为vanity import path,字面义是虚荣心导入路径,即以个人或组织官方域名作为前缀的包导入路径。采用vanity import path的包避免了包迁移对包使用者的影响。包使用者完全无需关心包的实际存储位置是在github上还是在bitbucket上或是私有服务器上。同时将vanity import path作为包的权威路径(canonical import path),也方便go get等对包权威路径的检查,避免包路径变更的前后不一致。

之前笔者曾经写过两篇文章介绍了利用govanityurls这个工具实现自定义包导入路径的方法。不过这种方法有一个约束条件,那就是你需要有一台VPS主机来部署运行govanityurls。虽然现在的云主机很便宜,但是购买和自建毕竟还是要付出一定成本的。如果没有VPS搭建govanityurls服务,那我们是否还有其他方法来自定义Go包导入路径呢?答案当然是有。

根据Go官方关于go get命令的文档,当go get从非知名托管站点(github, bitbucket等之外的站点)获取go包时,会尝试在返回的http/https应答head标签中查找是否有如下形式meta标签:

<meta name="go-import" content="import-prefix vcs repo-root">

meta标签中的name值是固定的"go-import",import-prefix即包vanity import path,比如:/gocmpp;vcs是采用的版本控制工具,git、svn或hg等;repo-root是包代码的实际存储服务器url。

下面是一个实际例子:

<meta name="go-import" content="/gocmpp git https:///bigwhite/gocmpp">

对于这样的标签,go get会做进一步匹配(可参见GOROOT/src/cmd/go/internal/get/vcs.go中的matchGoImport函数实现),看content值中的import-prefix是否是go get所需要的包的导入路径。如果是,则会向真正存储包代码的服务器再次发起代码获取请求(比如:git clone等)。

你可能会说:我用一个静态站点服务也能返回这样的应答。没错!但搭建静态站点一般还是需要VPS,这里我们介绍一种无须VPS的方法:利用github pages。

下面是利用github pages实现自定义Go包导入路径的原理图:

图:利用github pages实现自定义Go包导入路径

下面我们就以/gocmpp这个包导入路径的定制步骤来说明一下上述原理。

首先,我们要给tonybai.com这个域名添加一个子域名:作为我个人生产的所有Go包的导入路径前缀。我在DNS设置中为指定一个CNAME值:.github.io。这样当访问时,实际上是向.github.io发起请求。当然此刻如果你向发起请求时,你必然会得到404错误,因为github尚未建立起.github.io这个站点。

接下来,我们就来建立.github.io这个基于github pages的静态站点。我创建一个新的代码仓库:/bigwhite/.github.io,在该仓库的"Settings"标签中,我们启用github pages,并将该仓库的master分支作为站点的根路径。在同一页面的Custom domain下,我们填入,点击save保存。github会在该仓库中创建一个名为CNAME的文件,其内容如下:

$cat CNAME

表示该站点绑定了自定义域名:。

正常情况下,你还可以在Settings标签下启用该静态站点的HTTPS服务,github会自动向Let's Encrypt发起证书申请。

注:由于我的域名之前已经在Let's Encrypt申请过相关证书,这里始终失败。这样导致后续我们只能使用go get -insecure去获取Go包代码。

在该仓库中,我们创建一个名为gocmpp的文件:

<html> <head> <meta name="go-import" content="/gocmpp git https:///bigwhite/gocmpp"> <meta http-equiv="refresh" content="0;URL='https:///bigwhite/gocmpp'"> </head> <body> Redirecting you to the <a href="https:///bigwhite/gocmpp">project page</a>... </body></html>

该文件内容作为访问/gocmpp的请求的应答。

大约20分钟后,github pages内容生效。我们就可以使用下面命令去获取本存储在/bigwhite/gocmpp下面的包了:

$go get /gocmpp

由于证书问题,这里我们只能用go get -insecure,即让go get使用http协议发起请求。

在gopath mode下,我们的执行结果如下:

$GO111MODULE=off go get -x -v -insecure /gocmpp# get https:///gocmpp?go-get=1# get https:///gocmpp?go-get=1: 200 OK (1.012s)get "/gocmpp": found meta tag get.metaImport{Prefix:"/gocmpp", VCS:"git", RepoRoot:"https:///bigwhite/gocmpp"} at ///gocmpp?go-get=1/gocmpp (download)cd .git clone -- https:///bigwhite/gocmpp /Users/tonybai/Go/src//gocmppcd /Users/tonybai/Go/src//gocmppgit submodule update --init --recursivecd /Users/tonybai/Go/src//gocmppgit show-refcd /Users/tonybai/Go/src//gocmppgit submodule update --init --recursive.... ....cd /Users/tonybai/Go/src//gocmpp/Users/tonybai/.bin/go1.14/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p /gocmpp -complete -buildid O9VmohLTciBDjallbacN/O9VmohLTciBDjallbacN -goversion go1.14 -D "" -importcfg $WORK/b001/importcfg -pack -c=4 ./activetest.go ./client.go ./conn.go ./connect.go ./deliver.go ./fwd.go ./packet.go ./receipt.go ./server.go ./submit.go ./terminate.go/Users/tonybai/.bin/go1.14/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internalcp $WORK/b001/_pkg_.a /Users/tonybai/Library/Caches/go-build/ec/ec99b1c49c84d1e2edf88bee646f17198acc38c2c8f5a3d859540a394d6c5d0c-d # internalmkdir -p /Users/tonybai/Go/pkg/darwin_amd64//mv $WORK/b001/_pkg_.a /Users/tonybai/Go/pkg/darwin_amd64//gocmpp.arm -r $WORK/b001//Users/tonybai/go/src git:(master) $tree -L 1 └── gocmpp1 directory, 0 files

我们看到go get成功通过/gocmpp获取到gocmpp包,并编译安装成功(安装到GOPATH/pkg/下面)。

下面是module-aware模式下的go get获取结果:

$GOPROXY='direct' go get -insecure -x -v /gocmpp# get https:///?go-get=1# get https:///gocmpp?go-get=1# get https:///?go-get=1: 200 OK (1.032s)# get https:///gocmpp?go-get=1: 200 OK (1.056s)get "/gocmpp": found meta tag get.metaImport{Prefix:"/gocmpp", VCS:"git", RepoRoot:"https:///bigwhite/gocmpp"} at ///gocmpp?go-get=1mkdir -p /Users/tonybai/Go/pkg/mod/cache/vcs # git3 https:///bigwhite/gocmpp... ...0.017s # cd /Users/tonybai/Go/pkg/mod/cache/vcs/63c8ecfc5ed2c830894c13fd15ab1494ce9897aefba1d11c78740b046033e9ae; git cat-file blob 0f5a658fda5e029943f9b256fefe4fa4550e7906:go.modgo get: /[email protected]: parsing go.mod: module declares its path as: /bigwhite/gocmpp but was required as: /gocmpp

我们看到go get同样获取到了gocmpp module,但是由于module-aware模式下,go get会对module根路径进行检查,因此go get发现了go.mod中的module根路径:/bigwhite/gocmpp与要获取的module路径(/gocmpp)不符并报错。我们更新一下gocmpp项目中的go.mod内容后,这个问题将不复存在。

这样,我们在没有VPS的前提下也实现了自定义包导入路径。后续每当我创建一个新module或新包,我只需向该仓库(.github.io)提交一个以module或package名字命名的文件即可,就像上的gocmpp文件那样。



我爱发短信:企业级短信平台定制开发专家 https://51smspush.com/ smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展;短信内容你来定,不再受约束, 接>口丰富,支持长短信,签名可选。

2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

•微信公众号:iamtonybai

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/18558.html

    分享给朋友:

    “没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径” 的相关文章

    解密美国服务器CN2线路:到底是什么意思?

    美国服务器CN2线路是什么意思?在全球化的今天,越来越多的企业和个人选择使用服务器来满足其业务和数据存储需求。其中,美国服务器因其高速的网络性能和稳定的访问体验而备受青睐。而CN2线路,作为中国移动通信集团推出的一项高品质网络服务,更是为美国服务器的用户带来了全新的体验。本文将深入探讨“美国服务器C...

    IP地址可以是255吗?详解IP地址的定义、结构与未来发展趋势

    IP地址的定义与作用 IP地址是互联网协议(IP)中用于标识网络上设备的逻辑地址。它就像是互联网世界的“门牌号”,帮助数据包准确地找到目的地。没有IP地址,设备之间就无法相互识别和通信。无论是电脑、手机还是服务器,只要连接到网络,都会分配一个唯一的IP地址。它的存在让互联网的运作变得有序且高效。 I...

    Oracle 免费VPS:轻松入门云计算的最佳选择

    在了解Oracle免费VPS之前,先来看看Oracle Cloud。这是甲骨文公司推出的一项云服务,提供了一系列强大的计算和存储资源。Oracle Cloud的最吸引人的部分是它的免费服务,给用户提供了机会,可以在没有经济负担的情况下体验云计算的强大功能。对于开发者、创业者或只是想进行一些小项目的用...

    AWS VPS Free: 如何利用AWS Free Tier免费服务轻松构建云计算项目

    当我第一次接触AWS (亚马逊网络服务) 的时候,最吸引我的就是他们提供的各种免费的VPS服务。AWS的VPS免费服务实际上是一种叫做AWS Free Tier的计划,它允许用户在一定条件下使用AWS的多种服务而无需支付费用。这项计划的意义在于,它为刚入门的开发者和小型企业提供了一个绝佳的机会,能够...

    Bandwagon 意思与效应解析:理解群体行为的心理机制

    “Bandwagon”这个词听上去或许有些陌生,但它的意思和背景却十分有趣。简单来说,Bandwagon指的是一种说服技巧,通常用来引导他人追随某个观点或趋势。你有没有发现,在某些情况下,会有人因为周围大多数人都选择某种方式而随之附和?这种现象正是Bandwagon的核心思想。在这种情况下,个体的决...

    如何有效管理与维护VPS证书以提升网站安全性

    在互联网时代,数据安全变得愈发重要,VPS(虚拟专用服务器)证书就是确保在线安全性的重要工具。简单来说,VPS证书是一种数字证书,用于验证网站的身份并加密网站与用户之间的信息。借助这样的证书,用户在输入个人信息或进行交易时,能更加安心。 了解VPS证书的功能,可以更好地保护网站免受潜在的网络攻击。它...