日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go get 指定版本_没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径...

發(fā)布時(shí)間:2025/3/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go get 指定版本_没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們見到的Go包的導(dǎo)入路徑常常以github.com、bitbucket.org等代碼托管站點(diǎn)的域名為前綴,這樣的包導(dǎo)入路徑有一個(gè)問題,那就是當(dāng)Go包的托管站點(diǎn)發(fā)生變更時(shí)(比如從github.om遷移到bitbucket.org或gitlab.com),該包的使用者需要更新包的導(dǎo)入路徑。當(dāng)然,在支持go module+GOPROXY的情況下,如果使用者不再升級包版本,他/她完全可以繼續(xù)使用原包導(dǎo)入路徑,但這僅是特例。

還有一些包的導(dǎo)入路徑并非以知名代碼托管站點(diǎn)域名作為前綴,比如:Go官方擴(kuò)展包text,它的包導(dǎo)入路徑是golang.org/x/text,這種包導(dǎo)入路徑被稱為vanity import path,字面義是虛榮心導(dǎo)入路徑,即以個(gè)人或組織官方域名作為前綴的包導(dǎo)入路徑。采用vanity import path的包避免了包遷移對包使用者的影響。包使用者完全無需關(guān)心包的實(shí)際存儲位置是在github上還是在bitbucket上或是私有服務(wù)器上。同時(shí)將vanity import path作為包的權(quán)威路徑(canonical import path),也方便go get等對包權(quán)威路徑的檢查,避免包路徑變更的前后不一致。

之前筆者曾經(jīng)寫過兩篇文章介紹了利用govanityurls這個(gè)工具實(shí)現(xiàn)自定義包導(dǎo)入路徑的方法。不過這種方法有一個(gè)約束條件,那就是你需要有一臺VPS主機(jī)來部署運(yùn)行g(shù)ovanityurls。雖然現(xiàn)在的云主機(jī)很便宜,但是購買和自建畢竟還是要付出一定成本的。如果沒有VPS搭建govanityurls服務(wù),那我們是否還有其他方法來自定義Go包導(dǎo)入路徑呢?答案當(dāng)然是

根據(jù)Go官方關(guān)于go get命令的文檔,當(dāng)go get從非知名托管站點(diǎn)(github, bitbucket等之外的站點(diǎn))獲取go包時(shí),會嘗試在返回的http/https應(yīng)答head標(biāo)簽中查找是否有如下形式meta標(biāo)簽:

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

meta標(biāo)簽中的name值是固定的"go-import",import-prefix即包vanity import path,比如:go.tonybai.com/gocmpp;vcs是采用的版本控制工具,git、svn或hg等;repo-root是包代碼的實(shí)際存儲服務(wù)器url。

下面是一個(gè)實(shí)際例子:

name="go-import" content="go.tonybai.com/gocmpp git https://github.com/bigwhite/gocmpp">

對于這樣的標(biāo)簽,go get會做進(jìn)一步匹配(可參見GOROOT/src/cmd/go/internal/get/vcs.go中的matchGoImport函數(shù)實(shí)現(xiàn)),看content值中的import-prefix是否是go get所需要的包的導(dǎo)入路徑。如果是,則會向真正存儲包代碼的服務(wù)器再次發(fā)起代碼獲取請求(比如:git clone等)。

你可能會說:我用一個(gè)靜態(tài)站點(diǎn)服務(wù)也能返回這樣的應(yīng)答。沒錯(cuò)!但搭建靜態(tài)站點(diǎn)一般還是需要VPS,這里我們介紹一種無須VPS的方法:利用github pages

下面是利用github pages實(shí)現(xiàn)自定義Go包導(dǎo)入路徑的原理圖:

圖:利用github pages實(shí)現(xiàn)自定義Go包導(dǎo)入路徑

下面我們就以go.tonybai.com/gocmpp這個(gè)包導(dǎo)入路徑的定制步驟來說明一下上述原理。

首先,我們要給tonybai.com這個(gè)域名添加一個(gè)子域名:go.tonybai.com作為我個(gè)人生產(chǎn)的所有Go包的導(dǎo)入路徑前綴。我在DNS設(shè)置中為go.tonybai.com指定一個(gè)CNAME值:go.tonybai.com.github.io。這樣當(dāng)訪問go.tonybai.com時(shí),實(shí)際上是向go.tonybai.com.github.io發(fā)起請求。當(dāng)然此刻如果你向go.tonybai.com發(fā)起請求時(shí),你必然會得到404錯(cuò)誤,因?yàn)間ithub尚未建立起go.tonybai.com.github.io這個(gè)站點(diǎn)。

接下來,我們就來建立go.tonybai.com.github.io這個(gè)基于github pages的靜態(tài)站點(diǎn)。我創(chuàng)建一個(gè)新的代碼倉庫:github.com/bigwhite/go.tonybai.com.github.io,在該倉庫的"Settings"標(biāo)簽中,我們啟用github pages,并將該倉庫的master分支作為站點(diǎn)的根路徑。在同一頁面的Custom domain下,我們填入go.tonybai.com,點(diǎn)擊save保存。github會在該倉庫中創(chuàng)建一個(gè)名為CNAME的文件,其內(nèi)容如下:

$cat CNAMEgo.tonybai.com

表示該站點(diǎn)綁定了自定義域名:go.tonybai.com

正常情況下,你還可以在Settings標(biāo)簽下啟用該靜態(tài)站點(diǎn)的HTTPS服務(wù),github會自動向Let's Encrypt發(fā)起證書申請。

注:由于我的域名之前已經(jīng)在Let's Encrypt申請過相關(guān)證書,這里始終失敗。這樣導(dǎo)致后續(xù)我們只能使用go get -insecure去獲取Go包代碼。

在該倉庫中,我們創(chuàng)建一個(gè)名為gocmpp的文件:

name="go-import" content="go.tonybai.com/gocmpp git https://github.com/bigwhite/gocmpp"> http-equiv="refresh" content="0;URL='https://github.com/bigwhite/gocmpp'"> Redirecting you to the <a href="https://github.com/bigwhite/gocmpp">project pagea>...

該文件內(nèi)容作為訪問go.tonybai.com/gocmpp的請求的應(yīng)答。

大約20分鐘后,github pages內(nèi)容生效。我們就可以使用下面命令去獲取本存儲在github.com/bigwhite/gocmpp下面的包了:

$go get go.tonybai.com/gocmpp

由于證書問題,這里我們只能用go get -insecure,即讓go get使用http協(xié)議發(fā)起請求。

在gopath mode下,我們的執(zhí)行結(jié)果如下:

$GO111MODULE=off go get -x -v -insecure go.tonybai.com/gocmpp# get https://go.tonybai.com/gocmpp?go-get=1# get https://go.tonybai.com/gocmpp?go-get=1: 200 OK (1.012s)get "go.tonybai.com/gocmpp": found meta tag get.metaImport{Prefix:"go.tonybai.com/gocmpp", VCS:"git", RepoRoot:"https://github.com/bigwhite/gocmpp"} at //go.tonybai.com/gocmpp?go-get=1go.tonybai.com/gocmpp (download)cd .git clone -- https://github.com/bigwhite/gocmpp /Users/tonybai/Go/src/go.tonybai.com/gocmppcd /Users/tonybai/Go/src/go.tonybai.com/gocmppgit submodule update --init --recursivecd /Users/tonybai/Go/src/go.tonybai.com/gocmppgit show-refcd /Users/tonybai/Go/src/go.tonybai.com/gocmppgit submodule update --init --recursive.... ....cd /Users/tonybai/Go/src/go.tonybai.com/gocmpp/Users/tonybai/.bin/go1.14/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p go.tonybai.com/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/go.tonybai.com/mv $WORK/b001/_pkg_.a /Users/tonybai/Go/pkg/darwin_amd64/go.tonybai.com/gocmpp.arm -r $WORK/b001//Users/tonybai/go/src git:(master) $tree -L 1 go.tonybai.comgo.tonybai.com└── gocmpp1 directory, 0 files

我們看到go get成功通過go.tonybai.com/gocmpp獲取到gocmpp包,并編譯安裝成功(安裝到GOPATH/pkg/下面)。

下面是module-aware模式下的go get獲取結(jié)果:

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

我們看到go get同樣獲取到了gocmpp module,但是由于module-aware模式下,go get會對module根路徑進(jìn)行檢查,因此go get發(fā)現(xiàn)了go.mod中的module根路徑:github.com/bigwhite/gocmpp與要獲取的module路徑(go.tonybai.com/gocmpp)不符并報(bào)錯(cuò)。我們更新一下gocmpp項(xiàng)目中的go.mod內(nèi)容后,這個(gè)問題將不復(fù)存在。

這樣,我們在沒有VPS的前提下也實(shí)現(xiàn)了自定義包導(dǎo)入路徑。后續(xù)每當(dāng)我創(chuàng)建一個(gè)新module或新包,我只需向該倉庫(go.tonybai.com.github.io)提交一個(gè)以module或package名字命名的文件即可,就像上的gocmpp文件那樣。

?參考資料:https://gianarb.it/blog/go-mod-vanity-url


我的Go技術(shù)專欄:“改善Go語?編程質(zhì)量的50個(gè)有效實(shí)踐”上線了,歡迎大家訂閱學(xué)習(xí)!

我的網(wǎng)課“Kubernetes實(shí)戰(zhàn):高可用集群搭建、配置、運(yùn)維與應(yīng)用”在慕課網(wǎng)上線>了,感謝小伙伴們學(xué)習(xí)支持!

我愛發(fā)短信:企業(yè)級短信平臺定制開發(fā)專家 https://51smspush.com/ smspush : 可部署在企業(yè)內(nèi)部的定制化短信平臺,三網(wǎng)覆蓋,不懼大并發(fā)接入,可定制擴(kuò)展;短信內(nèi)容你來定,不再受約束, 接>口豐富,支持長短信,簽名可選。

2020年4月8日,中國三大電信運(yùn)營商聯(lián)合發(fā)布《5G消息白皮書》,51短信平臺也會全新升級到“51商用消息平臺”,全面支持5G RCS消息。

著名云主機(jī)服務(wù)廠商DigitalOcean發(fā)布最新的主機(jī)計(jì)劃,入門級Droplet配置升級為:1 core CPU、1G內(nèi)存、25G高速SSD,價(jià)格5$/月。有使用DigitalOcean需求的朋友,可以打開這個(gè)鏈接地址:https://m.do.co/c/bff6eed92687 開啟你的DO主機(jī)之路。

我的聯(lián)系方式:

?微博:https://weibo.com/bigwhite20xx?微信公眾號:iamtonybai?博客:tonybai.com?github: https://github.com/bigwhite?Gopher Daily(Go每日新聞)歸檔倉庫 - https://github.com/bigwhite/gopherdaily

微信贊賞:

商務(wù)合作方式:撰稿、出書、培訓(xùn)、在線課程、合伙創(chuàng)業(yè)、咨詢、廣告合作。

總結(jié)

以上是生活随笔為你收集整理的go get 指定版本_没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。