Golang項目中如何輕松實現私有倉庫pkg包的引入

在企業內部創建一個公共的Golang模塊工程可以幫助提高代碼復用性和開發效率。本文將從如何創建一個公共的Golang工程開始,指導你一步步創建它、并引入到你的工程中。

1、公共模塊規范

下面是一個簡單的步驟指南來創建這樣一個公共模塊項目。

創建版本控制倉庫:使用版本控制工具(如Git)創建一個新的代碼倉庫,用于管理該公共模塊工程的代碼。

項目結構:定義好項目的結構,使其易于理解和使用。一個常見的Golang項目結構如下:

my-module/|- README.md        # 項目文檔和說明|- go.mod           # Go模塊定義文件|- go.sum           # Go模塊的依賴版本文件|- cmd/             # 命令行應用程序目錄(如果有的話)|- pkg/             # 項目的庫代碼目錄|- internal/        # 內部庫代碼目錄,不對外公開|- examples/        # 示例代碼目錄|- tests/           # 單元測試和集成測試目錄
  1. Go模塊初始化:進入項目根目錄,運行 go mod init <module-name> 來初始化 Go 模塊。模塊名稱應該是該模塊工程的唯一標識符。

  2. 編寫代碼:在 pkg/ 目錄下編寫公共的Golang庫代碼。這些代碼應該是可復用的,不與具體應用邏輯綁定。

  3. 文檔和注釋:對于公共模塊,清晰的文檔和注釋是非常重要的。確保每個公共函數和類型都有良好的注釋,方便其他開發人員理解和使用。

  4. 示例代碼:在 examples/ 目錄下提供一些簡單的示例代碼,展示如何使用這個公共模塊。

  5. 單元測試:編寫完整的單元測試和集成測試,保證模塊的正確性和穩定性。測試代碼放在 tests/ 目錄下。

  6. 版本管理:在Go中,版本管理使用Go Modules。當你的模塊準備發布新版本時,確保適當地更新go.mod文件,并通過 go get <module-name>@<version>go mod tidy 來更新依賴關系。

  7. 持續集成:將公共模塊納入到企業的持續集成流程中,確保每次修改都通過了測試,并符合質量標準。

  8. 發布和文檔:根據企業內部的發布流程,發布新的版本,并及時更新項目文檔,方便其他開發人員使用。

以上是一個基本的指南來創建企業內部的Golang公共模塊工程,可根據實現項目靈活調整。記得在開發過程中關注代碼質量和安全性,并積極傾聽來自其他開發人員的反饋,不斷改進和優化模塊。

2、如何引入公共模塊

在Go中引入私有Git倉庫的包可以通過在 go.mod 文件中添加 replacerequire 語句來實現,具體取決于你的使用場景。以下是引入私有Git倉庫包的三種常見方法。

在下述前兩種方法中,你需要將 github.com/yourusername/yourprivatepkg 替換為你私有Git倉庫的實際路徑,然后根據需要設置路徑或版本號。

完成后,運行 go mod tidy 命令來更新依賴。Go會自動下載和管理你的私有Git倉庫包。

2.1 私有項目的路徑替換

使用 replace 語句實現。

如果你希望在開發過程中使用本地路徑或其他方式替代私有Git倉庫,可以使用 replace 語句。這樣可以方便地在不同環境中進行開發和測試。

如果私有項目 A 依賴另一個私有項目 B,且通過 go get 無法獲取權限,可以采用 replace 方式。

在你的項目的 go.mod 文件中添加類似如下的 replace 語句,將私有Git倉庫的路徑替換為本地路徑或其他路徑:

replace github.com/yourusername/yourprivatepkg => /path/to/local/repo

或者,你可以使用相對路徑:

replace github.com/yourusername/yourprivatepkg => ../path/to/local/repo

2.2 go mod私有項目的訪問

使用 require 語句實現。

如果你想直接從私有Git倉庫獲取包并將其添加到項目依賴中,可以使用 require 語句。

在你的項目的 go.mod 文件中添加類似如下的 require 語句,將私有Git倉庫的路徑和版本號添加到依賴中:

require github.com/yourusername/yourprivatepkg v1.0.0

要實現上述方式,需要額外的配置,確保能夠正常 go get 私有Git倉庫的工程。

  1. 設置 Go GOPRIVATE 變量

    # 配置多個私有項目地址
    go env -w GOPRIVATE="gitlab.example.com"
    # 其中gitee.com/user 是你的個人賬戶所在地址
    
    • 默認情況下,如果設置GOPRIVATE,會自動設置GONOPROXY和GONOSUMDB配置;

    • Golang項目非代理NOPROXY配置
      如果設置GONOPROXY和GONOSUMDB均為none,意味著所有module,不管是公共的還是私有的,都要經過proxy下載,經過sumdb驗證。

  2. 私有倉庫的請求認證

    方法一:在請求URL中嵌入認證信息

    git config --global url."https://${user}:${password}@gitlab.example.com".insteadOf "https://gitlab.example.com"
    

    Git全局配置查看和刪除:

    #查看git全局配置
    git config --global -l
    # 刪除url路徑替換, 或是修改${GitProject}/.git/config文件中對應url
    git config --global --unset url."git@gitlab.example.com".insteadOf
    

    方法二:使用SSH替換HTTPS進行認證

    git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com"
    
  3. Golang私有項目的http訪問

    如果私有庫不支持https協議,會報如下的錯誤。這是因為Go更新依賴時,會強制校驗CA證書來確保依賴庫的安全性。

    go: gitee.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "gitee.com/modules/project": https fetch: Get "https://gitee.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused
    

    如果私有庫不支持https協議,還需要go配置參數或環境變量,使其使用http方式訪問。

    方法一:go get -insecure

    使用 go get -insecure,這種方式不推薦,原因如下:

    • 添加 `-insecure`` 參數,即表示更新依賴時可以不去校驗CA證書,但是這會帶來一個問題:范圍無法界定(overkill),所有與要更新依賴相關聯的依賴,均不會去做校驗,可能會意外更新到不安全的依賴。

    • -insecure 僅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令時是無法更新不支持https協議的私有庫的。

    方法二:GOINSECURE

    添加 GOINSECURE 參數,推薦這種方式

    • 在Go 1.14 中增加了新的環境變量,用于指定哪些域名下的倉庫不去校驗 CA 證書。

    • 使用方式同 GOINSECURE 類似 go env -w GOINSECURE=gitlab.example.com

2.3 git 子模塊(推薦)

在 Go 中,你可以使用 Git 子模塊的方式引用私有的公共模塊工程,以便在你的項目中使用。

  1. 創建 Git 子模塊

    在你的項目中,使用以下命令添加 Git 子模塊,將私有的公共模塊工程作為子模塊引入:

    git submodule add <repository-url> path/to/submodule
    

    其中 <repository-url> 是你私有模塊工程的 Git 倉庫 URL,path/to/submodule 是子模塊在你的項目中的路徑。

  2. 配置認證

    如果你的私有模塊工程需要身份驗證,你可能需要在執行 go getgo mod 時提供適當的認證憑證。這可能包括用戶名、密碼、Personal Access Token(如果使用 GitLab)等。

  3. 使用子模塊的包

    在你的項目中,可以通過 import 語句引入子模塊的包,然后在代碼中使用這些包。

    import ("your/repo/path/to/submodule/package"
    )func main() {// 使用子模塊的包submodulepackage.DoSomething()
    }
    
  4. 使用 Go Modules 進行版本管理

    確保你的項目啟用了 Go Modules,并在 go.mod 文件中添加了子模塊的引用。

    go mod edit -replace=example.com/submodule=path/to/submodule
    
  5. 更新子模塊

    如果子模塊的工程代碼發生變化,你可以進入子模塊目錄,使用 git pull 更新子模塊的代碼。然后在你的項目根目錄使用 go mod tidy 更新模塊依賴。

3、總結

條條道路通羅馬,技術更是如此。

具體選擇那種取決于你的實際環境、實際場景,這里只提供一個思路、方向供大家參考。


參考文章:

  1. Go Mod引用私有庫
  2. 怎么讓Go Modules使用私有依賴模塊
  3. Git: submodule 子模塊簡明教程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X態&#xff0c;鼠標右鍵會有Trace X的選項&#xff1b; 會自動打開Temporal Flow View窗口&#xff0c;展示對應路徑&am…

RocketMQ、Dashboard部署以及安全設置

RocketMQ、dashboard部署以及安全設置 一、啟動RocketMQ1.1 下載RocketMQ1.2 修改配置文件1.2.1 修改nameServer Jvm內存配置1.2.2 修改broker參數 1.3 啟動1.3.1 啟動NameServer1.3.2 啟動Broker1.3.3 測試是否啟動成功1.3.3.1 測試消息發送1.3.3.2 測試消息接收1.3.3.3 Java程…

數據結構——配對堆

引入 配對堆是一個支持插入&#xff0c;查詢/刪除最小值&#xff0c;合并&#xff0c;修改元素等操作的數據結構&#xff0c;是一種可并堆。有速度快和結構簡單的優勢&#xff0c;但由于其為基于勢能分析的均攤復雜度&#xff0c;無法可持久化。 定義 配對堆是一棵滿足堆性質…

C語言暑假刷題沖刺篇——day1

目錄 一、選擇題 二、編程題 &#x1f388;個人主頁&#xff1a;庫庫的里昂 &#x1f390;CSDN新晉作者 &#x1f389;歡迎 &#x1f44d;點贊?評論?收藏?收錄專欄&#xff1a;C語言每日一練 ?其他專欄&#xff1a;代碼小游戲C語言初階&#x1f91d;希望作者的文章能對你…

問道管理:網上如何打新股?

隨著資本市場的不斷敞開&#xff0c;越來越多的人開始重視股票市場&#xff0c;并想經過網上打新股來取得更大的出資收益。但是&#xff0c;網上打新股的辦法并不簡略&#xff0c;怎樣才能成功地打新股呢&#xff1f;本文將從多個角度剖析&#xff0c;協助廣闊出資者處理這一問…

海信聚好看將攜新品DBdoctor,亮相中國數據庫技術大會(DTCC2023)

海信聚好看將攜新品DBdoctor&#xff0c;亮相中國數據庫技術大會 8月16日—18日&#xff0c;第14屆中國數據庫技術大會&#xff08;DTCC-2023&#xff09;將在北京國際會議中心隆重召開。作為國內數據庫領域規模最大的技術交流盛會&#xff0c;吸引了眾多業內知名企業和數百名…

[謙實思紀 01]整理自2023雷軍年度演講——《成長》(上篇)武大回憶(夢想與成長)

文章目錄 [謙實思紀]整理自2023雷軍年度演講 ——《成長》&#xff08;上篇&#xff09;武大回憶&#xff08;夢想與成長&#xff09;0. 寫在前面1. 夢開始的地方1.1 要有夢想&#xff0c;要用目標量化夢想 2. 在兩年內修完所有的學分。2.1 別老自己琢磨&#xff0c;找個懂的人…

【LeetCode 算法】Matrix Diagonal Sum 矩陣對角線元素的和

文章目錄 Matrix Diagonal Sum 矩陣對角線元素的和問題描述&#xff1a;分析代碼Math Tag Matrix Diagonal Sum 矩陣對角線元素的和 問題描述&#xff1a; 給你一個正方形矩陣 mat&#xff0c;請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不…

Python爬蟲IP代理池的建立和使用

寫在前面 建立Python爬蟲IP代理池可以提高爬蟲的穩定性和效率&#xff0c;可以有效避免IP被封鎖或限制訪問等問題。 下面是建立Python爬蟲IP代理池的詳細步驟和代碼實現&#xff1a; 1. 獲取代理IP 我們可以從一些代理IP網站上獲取免費或付費的代理IP&#xff0c;或者自己租…

【深度學習所有損失函數】在 NumPy、TensorFlow 和 PyTorch 中實現(1/2)

一、說明 在本文中&#xff0c;討論了深度學習中使用的所有常見損失函數&#xff0c;并在NumPy&#xff0c;PyTorch和TensorFlow中實現了它們。 二、內容提要 我們本文所談的代價函數如下所列&#xff1a; 均方誤差 &#xff08;MSE&#xff09; 損失二進制交叉熵損失加權二進…

“深入解析JVM內部機制:探索Java虛擬機的奧秘“

標題&#xff1a;深入解析JVM內部機制&#xff1a;探索Java虛擬機的奧秘 JVM&#xff08;Java虛擬機&#xff09;是Java程序的核心執行環境&#xff0c;它負責將Java字節碼轉換為機器碼并執行。了解JVM的內部機制對于理解Java程序的執行過程和性能優化至關重要。本文將深入解析…

開啟想象翅膀:輕松實現文本生成模型的創作應用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,開箱即用

開啟想象翅膀&#xff1a;輕松實現文本生成模型的創作應用&#xff0c;支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型&#xff0c;開箱即用 TextGen: Implementation of Text Generation models 1.介紹 TextGen實現了多種文本生成模型&#xff0c;包括&a…

c++——::作用域、命名空間、using(聲明和編譯指令)

c 作用域和名字控制 一、::(雙冒號) 作用域 <::>運算符是一個作用域如果<::>前面什么都沒有加 代表是全局作用域 二、命名空間&#xff08;namespace) 1、namespace 本質是作用域,可以更好的控制標識符的作用域命名空間 就可以存放 變量 函數 類 結構體 … 2…

【kubernetes】在k8s集群環境上,部署kubesphere

部署kubesphere 學習于尚硅谷kubesphere課程 前置環境配置-部署默認存儲類型 這里使用nfs #所有節點安裝 yum install -y nfs-utils# 在master節點執行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports # 執行以下命令&#xff…

QML與C++交互

目錄 1 QML獲取C的變量值 2 QML獲取C創建的自定義對象 3 QML發送信號綁定C端的槽 4 C端發送信號綁定qml端槽 5 C調用QML端函數 1 QML獲取C的變量值 QQmlApplicationEngine engine; 全局對象 上下文屬性 QQmlApplicationEngine engine; QQmlContext *context1 engine.…

flowable流程移植新項目前端問題匯總

flowable流程移植到新項目時&#xff0c;出現一些前端問題&#xff0c;匯總如下&#xff1a; PS F:\khxm\NBCIO_VUE> yarn run serve yarn run v1.21.1 $ vue-cli-service serve INFO Starting development server... ERROR Error: Vue packages version mismatch: -…

25 | 葡萄酒質量數據分析

基于kaggle提供的公開數據集,對全球葡萄酒分布情況和質量情況進行數據探索和分析 from kaggle: https://www.kaggle.com/zynicide/wine-reviews 分析思路: 0、數據準備 1、葡萄酒的種類 2、葡萄酒質量 3、葡萄酒價格 4、葡萄酒描述詞庫 5、品鑒師信息 6、總結 0、數據準備 …

學習Vue:組件的概念和優勢

在現代的前端開發中&#xff0c;組件化開發是一種重要的方法&#xff0c;它可以將復雜的應用程序拆分成多個獨立的、可復用的組件。Vue.js 是一個流行的前端框架&#xff0c;它支持組件化開發&#xff0c;讓開發者能夠更輕松地構建和維護復雜的用戶界面。在本文中&#xff0c;我…

計算機組成部分

計算機的五大部件是什么&#xff1f;答案&#xff1a;計算機的五大部件是運算器&#xff0c;控制器&#xff0c;存儲器&#xff0c;輸入設備和輸出設備。 其中運算器和控制器合稱中央處理器&#xff0c;是計算機的核心部件&#xff1b; 存儲器是用來存儲程序指令和數據用的&am…

修改第三方組件默認樣式

深度選擇器 修改el-input的樣式&#xff1a; <el-input class"input-area"></el-input>查看DOM結構&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }將 input 框背景色改為…