go get 指定版本_没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径...
我們見到的Go包的導入路徑常常以github.com、bitbucket.org等代碼托管站點的域名為前綴,這樣的包導入路徑有一個問題,那就是當Go包的托管站點發生變更時(比如從github.om遷移到bitbucket.org或gitlab.com),該包的使用者需要更新包的導入路徑。當然,在支持go module+GOPROXY的情況下,如果使用者不再升級包版本,他/她完全可以繼續使用原包導入路徑,但這僅是特例。
還有一些包的導入路徑并非以知名代碼托管站點域名作為前綴,比如:Go官方擴展包text,它的包導入路徑是golang.org/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標簽:
name="go-import" content="import-prefix vcs repo-root">meta標簽中的name值是固定的"go-import",import-prefix即包vanity import path,比如:go.tonybai.com/gocmpp;vcs是采用的版本控制工具,git、svn或hg等;repo-root是包代碼的實際存儲服務器url。
下面是一個實際例子:
name="go-import" content="go.tonybai.com/gocmpp git https://github.com/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包導入路徑下面我們就以go.tonybai.com/gocmpp這個包導入路徑的定制步驟來說明一下上述原理。
首先,我們要給tonybai.com這個域名添加一個子域名:go.tonybai.com作為我個人生產的所有Go包的導入路徑前綴。我在DNS設置中為go.tonybai.com指定一個CNAME值:go.tonybai.com.github.io。這樣當訪問go.tonybai.com時,實際上是向go.tonybai.com.github.io發起請求。當然此刻如果你向go.tonybai.com發起請求時,你必然會得到404錯誤,因為github尚未建立起go.tonybai.com.github.io這個站點。
接下來,我們就來建立go.tonybai.com.github.io這個基于github pages的靜態站點。我創建一個新的代碼倉庫:github.com/bigwhite/go.tonybai.com.github.io,在該倉庫的"Settings"標簽中,我們啟用github pages,并將該倉庫的master分支作為站點的根路徑。在同一頁面的Custom domain下,我們填入go.tonybai.com,點擊save保存。github會在該倉庫中創建一個名為CNAME的文件,其內容如下:
$cat CNAMEgo.tonybai.com表示該站點綁定了自定義域名:go.tonybai.com。
正常情況下,你還可以在Settings標簽下啟用該靜態站點的HTTPS服務,github會自動向Let's Encrypt發起證書申請。
注:由于我的域名之前已經在Let's Encrypt申請過相關證書,這里始終失敗。這樣導致后續我們只能使用go get -insecure去獲取Go包代碼。
在該倉庫中,我們創建一個名為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>...該文件內容作為訪問go.tonybai.com/gocmpp的請求的應答。
大約20分鐘后,github pages內容生效。我們就可以使用下面命令去獲取本存儲在github.com/bigwhite/gocmpp下面的包了:
$go get go.tonybai.com/gocmpp由于證書問題,這里我們只能用go get -insecure,即讓go get使用http協議發起請求。
在gopath mode下,我們的執行結果如下:
$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獲取結果:
$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根路徑進行檢查,因此go get發現了go.mod中的module根路徑:github.com/bigwhite/gocmpp與要獲取的module路徑(go.tonybai.com/gocmpp)不符并報錯。我們更新一下gocmpp項目中的go.mod內容后,這個問題將不復存在。
這樣,我們在沒有VPS的前提下也實現了自定義包導入路徑。后續每當我創建一個新module或新包,我只需向該倉庫(go.tonybai.com.github.io)提交一個以module或package名字命名的文件即可,就像上的gocmpp文件那樣。
?參考資料:https://gianarb.it/blog/go-mod-vanity-url
我的Go技術專欄:“改善Go語?編程質量的50個有效實踐”上線了,歡迎大家訂閱學習!
我的網課“Kubernetes實戰:高可用集群搭建、配置、運維與應用”在慕課網上線>了,感謝小伙伴們學習支持!
我愛發短信:企業級短信平臺定制開發專家 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主機之路。
我的聯系方式:
?微博:https://weibo.com/bigwhite20xx?微信公眾號:iamtonybai?博客:tonybai.com?github: https://github.com/bigwhite?Gopher Daily(Go每日新聞)歸檔倉庫 - https://github.com/bigwhite/gopherdaily
微信贊賞:
商務合作方式:撰稿、出書、培訓、在線課程、合伙創業、咨詢、廣告合作。
總結
以上是生活随笔為你收集整理的go get 指定版本_没有VPS搭建govanityurls服务?别急!你依然可以自定义Go包导入路径...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis的简单查询用语句吗_FIL
- 下一篇: python新闻推荐系统_python实