<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用私有倉庫的 Go Modules

          共 3073字,需瀏覽 7分鐘

           ·

          2020-09-21 14:18

          本文我們將討論 go modules 的基本用法,以及如何創(chuàng)建自己的 go modules,如何在自己的 go 項目中引用私有 git 倉庫的模塊。模塊大大提高了 go 的代碼可維護性,它是 golang 官方提供的依賴管理工具,就像 Java 應用中的 Maven 一樣,如果你對 go modules 了解不多,可以查看官方文檔相關介紹。

          創(chuàng)建 go module

          在 Java 中,一個制品可以通過 Nexus 這樣的倉庫來維護的,同樣,我們可以將自己的 go modules 托管在 Git 或 Bitbucket 上,比如我們這里使用非常方便的 GitHub。創(chuàng)建一個如下所示的目錄,在目錄中初始化 modules:

          $?mkdir?common-module
          $?cd?common-module

          在項目中初始化 go 模塊的名稱,這里的名稱格式為 //

          • hosting-site: 就是 github.com
          • repository: 自己的 github 帳號名(ereshzealous)
          • module:模塊名稱 common-module

          所以最后 go 模塊的名稱就是 github.com/ereshzealous/common-module ,用 go mod init 初始化:

          $?go?mod?init?github.com/ereshzealous/common-module

          接下來我們在這個模塊中創(chuàng)建一個簡單的 go 文件,添加幾個示例函數(shù):

          package?common

          //?GetCommonData?a?method
          func?GetCommonData()?string?{
          ?return?"Common?Data"
          }

          func?GetData()?string?{
          ?return?"Data"
          }

          然后將代碼提交到 GitHub 上,并將其發(fā)布為一個版本。

          發(fā)布后我們就可以在其他 go 項目中使用上面的 go modules 了,由于這個項目是公開的,所以所有人都可以使用,接下來我們將這個公開版本轉(zhuǎn)變成私有倉庫。

          開發(fā)環(huán)境

          如果上面的 go modules 已經(jīng)變成私有倉庫了,這個時候我們使用go get 命令來獲取這個模塊,會得到一個 410 Gone 的錯誤信息:

          要解決上述問題,在 go 項目中引入私有模塊可以用如下所示的方式。

          1. 通過 Go Mod 代理網(wǎng)站

          Go Module 的代理站點默認的 repo 是 https://proxy.golang.org/,direct ,由于我們的模塊發(fā)布在 github 上,所以我們需要提供一種機制來繞過代理站點的私有倉庫,這里可以使用 GOPRIVATE 來實現(xiàn),GOPRIVATE 環(huán)境變量用來表示不對外公開的模塊路徑。

          在開發(fā)環(huán)境中我們可以按照如下命令設置GOPRIVATE,多個值用逗號隔開。下面設置的是我的賬戶級別,我們也可以設置成倉庫級別,比如 github.com/ereshzealous/common-module

          $?go?env?-w?GOPRIVATE=github.com/ereshzealous

          2. 在構建過程中傳遞倉庫憑證

          由于我們使用的是 Github,所以我們在構建過程中需要提供 auth token。在開發(fā)環(huán)境中,這很簡單,有一個 git 命令來實現(xiàn)這個功能,在 gitconfig 文件中添加一個配置即可。

          點擊這里進入 GitHub 訪問令牌頁面,創(chuàng)建一個具有相應權限的 token,創(chuàng)建一個新的 token 或使用一個現(xiàn)有的 token 都可以。

          在生成 token 后,執(zhí)行以下命令。

          Github

          $?git?config?--global?url."https://${username}:${access_token}@github.com".insteadOf?/
          "https://github.com"

          Bitbucket

          在 Bitbucket 中,同樣創(chuàng)建一個訪問 token 并執(zhí)行以下命令。

          $?git?config?--global?url."https://${bitbucket_user_id}:${bitbucket_access_token}@privatebitbucket.com".insteadOf?
          ??"https://privateaccount.com"

          gitconfig 中進行上述設置后,我們再來嘗試使用 go modules。

          我們可以看到是可行的,當然對于 GitLab 私有倉庫也是一樣的操作方式,這對于開發(fā)環(huán)境來說都很方便,那么對于 CI/CD 或者 Docker 容器化環(huán)境應該怎么辦呢?

          Docker

          其實對于 Docker 容器中,私有私有 go modules 也很方便,我們可以直接在 Dockerfile 中配置私有倉庫,如下所示:

          #?Start?from?the?latest?golang?base?image
          FROM?golang:alpine

          RUN?GOCACHE=OFF

          RUN?go?env?-w?GOPRIVATE=github.com/ereshzealous

          #?Set?the?Current?Working?Directory?inside?the?container
          WORKDIR?/app

          #?Copy?everything?from?the?current?directory?to?the?Working?Directory?inside?the?container
          COPY?.?.

          RUN?apk?add?git

          RUN?git?config?--global?url."https://golang:@github.com".insteadOf?"https://github.com"

          #?Build?the?Go?app
          RUN?go?build?-o?main?.

          #?Expose?port?8080?to?the?outside?world
          EXPOSE?8080

          在上面的 Dockerfile 中,第6行我們通過環(huán)境變量 GOPRIVATE 設置了私有倉庫地址;在第17行通過 gitconfig 設置了一個訪問 token 和用戶名,這會把憑證傳遞給 go mod,為了使用 git 命令,還特地在鏡像中添加了 git 命令。

          上面構建過程中的 pvt 就是一個私有的 go mod 倉庫,可以看到正常獲取。當然在 CI/CD 的流水線當中也可以直接使用這個方式。

          參考鏈接

          • https://medium.com/swlh/go-modules-with-private-git-repository-3940b6835727
          • https://blog.golang.org/using-go-modules


          推薦閱讀


          福利

          我為大家整理了一份從入門到進階的Go學習資料禮包(下圖只是部分),同時還包含學習建議:入門看什么,進階看什么。

          關注公眾號 「polarisxu」,回復?ebook?獲取;還可以回復「進群」,和數(shù)萬 Gopher 交流學習。



          瀏覽 70
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产黄色视频在线观看 | 台湾在线无码视频 | 日本三级在线网站 | 操笔视频 | 高清无码毛片网站 |