go modules 使用本地庫、公開庫和私有庫

一、簡介

公司項目使用 go module 開發的過程中會有一些自己的庫要引用,這些庫用gitlab管理,需要研究引用gitlab庫的方法,下面是研究過程中的一些經驗。

介紹幾種引用方案:

  • 1、引用本地目錄
  • 2、引用合規地址庫
  • 3、引用私有不合規庫
  • 4、最常規(噁心) 的私有不合規庫

上述名詞中的 合規 是指:

  • 庫的地址是通過域名方式訪問
  • 支持HTTPS
  • 庫的地址通過 80 和 443 端口,而不是其它端口

滿足上述條件即是 合規庫,否則是 不合規庫,由於通常不合規庫都是私有的,這裏直接叫 私有不合規庫
其中,違反第3點的最爲噁心。

注意:本文撰寫於 2020年7月3日,go版本 1.14.4,到撰寫日爲止內容真實有效,均經過本人驗證。

二、引用本地目錄

修改文件 go.mod:

module main

go 1.14

// 替換規則
replace (
    github.com/pborman/uuid => /data/go-packages/uuid v1.2.0 // 絕對路徑 或 相對路徑 都可以
)

// 源地址
require (
    github.com/pborman/uuid v1.2.0
)

默認使用 github.com/pborman/uuid 包會到 Github 上去下載,但這個包還在本地開發中並未push到線上,那麼可以通過 replace 配置來重定向當前項目對該包的加載路徑:

github.com/pborman/uuid => /data/go-packages/uuid

這裏 /data/go-packages/uuid 爲本地包的絕對路徑,這樣寫就可以了,當本地 uuid 包代碼修改後就可以在當前項目看到實時效果了,注意中間符號是 =>

配置好以後正常拉取代碼、編譯、調試。

二、引用合規庫

引用本地目錄類似,修改文件 go.mod:

module main

go 1.14

// 替換規則
replace (
    github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 開源中國地址
)

// 源地址
require (
    github.com/pborman/uuid v1.2.0
)

接下來正常拉取代碼、編譯、調試。

三、引用私有不合規庫

3.1、配置倉庫訪問權限

有以下兩種授權方式:

  • 1、訪問令牌(Access Token)

    通過在gitlab生成個人的“訪問令牌”,並在拉取git倉庫的機器上配置Token來實現訪問倉庫。

    通常是在這個地址:https://{{gitlab_url}}/profile/personal_access_tokens

    {{gitlab_url}} 是gitlab地址

    personal_access_tokens

  • 2、SSH祕鑰(SSH Key) 【推薦】

    通過在gitlab的 個人賬戶 或者 倉庫 下面配置 SSH祕鑰,來實現客戶端訪問倉庫。

    注意:這種方式高效、簡單,只要保證本地 .ssh 目錄下存在相應的祕鑰對即可。

3.2、本地配置“訪問令牌(Access Token)”參數

使用"ssh密鑰"授權則跳過本節

對本項目生效:

git config http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"

對所有git項目生效:

git config --global http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"

注:根據需求任意選擇上面一個配置即可

3.3、配置使用git方式拉取代碼

git config --global url."git@{{gitlab_url}}:groupName/projectName.git".insteadOf "https://{{gitlab_url}}/groupName/projectName.git"` 

也可以直接全局替換,那麼可以拉取域名下的所有包,如:

git config --global url."git@{{gitlab_url}}:".insteadof "https://{{gitlab_url}}/"

上面是通過命令修改配置,也可以像這樣,直接修改配置文件 ~/.gitconfig,在裏面添加如下配置:

[url "git@{{gitlab_url}}:"]
    insteadOf = https://{{gitlab_url}}/

注意:

insteadof 中的參數是 https,因爲不管目標地址是http還是https,go get默認使用https方式訪問,因此我們要強制將https轉換成git協議。

五、最常見的私有不合規庫

爲什麼會有這種噁心至極的私有不合規庫?這種庫有什麼特點?

這種庫違反了合規庫每一條規則:

  • 1、ip訪問
  • 2、端口非80、443
  • 3、沒有證書

其中第3點並不重要,第2點是產生這種情況的根源。

這種情況下,我們要:

  • 1、結合章節 “三、引用私有不合規庫”

  • 2、在 go.mod 和 git config 中配置別名(映射)

    通過兩次別名,重定向到 IP:Port

    • 2.1、在 go.mod 中配置地址別名,該別名是真實有效的 HTTPS 地址

      go.mod 配置:

      module main
      
      go 1.14
      
      // 替換規則
      replace (
          github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 第一次別名地址,地址真是有效,並且是HTTPS
      )
      
      // 源地址
      require (
          github.com/pborman/uuid v1.2.0
      )
      
    • 2.2、在 git config 中再次配置別名,將 go.mod 中的別名指向真正的地址

      git config --global url."[email protected]:CloudComputing/Cloud-Fundamation/Operation-Center".insteadof "https://gitee.com/gober"
      

注意:
假如你的ssh端口也改了,不是22,記得git@{{gitlab_url}}裏面也要相應修改

參考資料及附錄


本文由 qingchuwudi 譯製或原創,除非另有聲明,在不與原著版權衝突的前提下,本作品採用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0) 進行許可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章