爲什麼要使用 Go module proxy

在看過 Go module 的簡介之後,我以爲我已經知道了這個功能我需要知道的一切。但是很快,我意識到並不是這樣。最近,人們開始提倡使用 Go module proxy。在研究了利弊之後,我得出結論,這將是近年來 Go 語言 最重要 的變化之一。但爲什麼會這樣呢?是什麼讓 Go module 代理如此特別?

使用 Go modules 時,如果向乾淨的緩存的計算機上添加新依賴項或構建 Go module,它將基於 go.mod 將下載(go get)所有依賴項,並將其緩存以供進一步操作。你也可以使用 -mod=vendor 參數構建 vendor 文件夾,來繞過緩存,以及後邊使用這些下載的依賴。

但以上兩種方法都不完美,我們應該可以做得更好。

本文是 Go 語言中文網組織的 GCTT 翻譯,發佈在 Go 語言中文網公衆號,轉載請聯繫我們授權。

(不)使用 vendor 文件夾的問題

使用 vendor 文件夾的問題

不使用的 vendor 的問題

那我們怎麼解決這些問題呢?

使用 Go module proxy 的好處

默認情況下, go 命令會直接從版本管理系統下載代碼。GOPROXY 環境變量允許在下載源的進一步控制。配置該環境變量後,go 命令可以使用 Go module proxy

設置環境變量 GOPROXY 開啓 Go module proxy 後,將解決上邊提到的所有問題。

如你所見,使用 Go module proxy 對人人都有好處。但是我們如何使用它呢?如果你不想維護自己的 Go module proxy 怎麼辦?這裏還有許多替代方案。

如何使用 Go module proxy

要開始使用 Go module proxy,我們需要將 GOPROXY 環境變量設置爲兼容的 Go module proxy。這有多種方式:

  1. 如果沒有設置 GOPROXY,將其設置爲空或設置爲 direct ,然後 go get 將直接到 VCS(例如 github.com)拉取代碼:

    GOPROXY=""
    GOPROXY=direct

    GOPROXY 也可以設置爲 off,這意味着不允許使用網絡

    GOPROXY=off
  2. 你可以開始使用公共 GOPROXY 。你也可以選擇使用 Go 官方團隊的 GOPROXY(由 Google 運營)。更多信息可以在這裏找到:https://proxy.golang.org/

    要開始使用它,你只需設置環境變量:

    GOPROXY=https://proxy.golang.org

    其他可用的公共代理:

    GOPROXY=https://goproxy.io
    GOPROXY=https://goproxy.cn # proxy.golang.org 被牆了, 這個沒有
  3. 你可以運行多個開源實現並自己託管。可用的有:

    你既可以自己維護,也可以通過公共互聯網或內部網絡獲取相關服務,看你自己的決定。

  4. Athens:https://github.com/gomods/athens

  5. goproxy:https://github.com/goproxy/goproxy

  6. THUMBAI:https://thumbai.app/

  7. 你可以購買商業產品:

    Artifactory: https://jfrog.com/artifactory/

  8. 你可以傳入 file:/// 路由。因爲 Go module proxy 是響應 GET 請求(沒有查詢參數)的 Web 服務器,所以任何文件系統中的文件夾都可以用作 Go module proxy

Go 1.13 的變化

在 Go v1.13 版本中, Go proxy 會有一些變化,我認爲應該強調一下:

  1. GOPROXY 環境變量現在可以設置爲逗號分隔的列表。它會在回到下一個路徑之前嘗試第一個代理。

  2. GOPROXY 的默認值爲 https://proxy.golang.org,direct。設置 direct 後將忽略之後的所有內容。這也意味着 go get 現在將默認使用 GOPROXY 。如果你根本不想使用 GOPROXY,則需要將其設置爲 off

  3. 新版本將引入了一個新的環境變量 GOPRIVATE ,它包含以逗號分隔的 全局列表。這可用於繞過 GOPROXY 某些路徑的代理,尤其是公司中的私有模塊(例如: GOPRIVATE=*.internal.company.com)。

所有這些變化都表明 Go module proxy 將是 Go module 的核心和重要組成。

總結

無論使用公共網絡,還是專用網絡,GOPROXY 都有很多優勢。這是一個很棒的工具,它可以和 go 命令無縫協作。鑑於它具有如此多的優勢(安全,快速,存儲高效),明智的做法是在您的項目或組織中快速接受它。此外,在 Go v1.13 版本中,默認情況下會啓用它,這是另一個受歡迎的步驟,它改善了 Go 中依賴項管理的現狀。


via: https://arslan.io/2019/08/02/why-you-should-use-a-go-module-proxy/

作者:Fatih Arslan[5] 譯者:TomatoAres[6] 校對:polaris1119[7]

本文由 GCTT[8] 原創編譯,Go 中文網 [9] 榮譽推出,發佈在 Go 語言中文網公衆號,轉載請聯繫我們授權。

參考資料

[1]

模塊感知模式: https://golang.org/cmd/go/#hdr-Modules_and_vendoring

[2]

在 Travis CI 上使用 Go Module 和 vendor: https://arslan.io/2018/08/26/using-go-modules-with-vendor-support-on-travis-ci/

[3]

記住左邊的傳奇故事: https://qz.com/646467/how-one-programmer-broke-the-internet-by-deleting-a-tiny-piece-of-code/

[4]

獲取單個文件: https://about.sourcegraph.com/go/gophercon-2019-go-module-proxy-life-of-a-query

[5]

Fatih Arslan: https://arslan.io/

[6]

TomatoAres: https://github.com/TomatoAres

[7]

polaris1119: https://github.com/polaris1119

[8]

GCTT: https://github.com/studygolang/GCTT

[9]

Go 中文網: https://studygolang.com/

福利

我爲大家整理了一份從入門到進階的 Go 學習資料禮包,包含學習建議:入門看什麼,進階看什麼。關注公衆號 「polarisxu」,回覆 ebook 獲取;還可以回覆「進羣」,和數萬 Gopher 交流學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2XfBNSbllD4AzSd3yAihdg