精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go項目中使用Git Submodule,還有這個必要嗎?

開發 前端
在大多數情況下,Go Modules確實已經覆蓋了Git Submodule在Go項目中的主要功能,甚至做的更好,比如:Go Modules提供了更細粒度的版本控制,能自動解析和下載依賴,并也可以確保了構建的可重現性。

在軟件開發中,依賴管理一直是一個重要的議題,特別是在像Go這樣的編程語言中,隨著項目的擴展,如何有效管理依賴變得至關重要。Git Submodule作為Git的一個重要功能,允許在一個Git倉庫中嵌入另一個倉庫,從而方便地管理跨項目的代碼共享。然而,Go語言引入的Go Module機制似乎已經解決了依賴管理的問題,那么在Go項目中,是否還有使用Git Submodule的必要呢?本文將簡單探討一下Go項目中Git Submodule的使用方法,并分析它是否還值得使用。

1. Git Submodule是什么?

Git Submodule是Git版本管理工具提供的一個功能,允許你將一個Git倉庫作為另一個Git倉庫(主倉庫)的子目錄。主倉庫通過記錄Submodule的URL和commit hash來追蹤Submodule。當你克隆一個包含Submodule的倉庫時,需要額外的步驟來初始化和更新Submodule。

下面是一個將github.com/rsc/pdf倉庫作為git submodule的示例。

我們先建立主倉庫:

$mkdir main-project
$cd main-project
$go mod init main-project
$git init
$git add -A
$git commit -m"initial import" .
[master (root-commit) 8227e65] initial import
 1 file changed, 3 insertions(+)
 create mode 100644 go.mod

接下來,我們來添加submodule:

$git submodule add https://github.com/rsc/pdf.git   
Cloning into '/Users/tonybai/Test/Go/submodule/main-project/pdf'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 48 (delta 21), reused 21 (delta 21), pack-reused 18 (from 1)
Unpacking objects: 100% (48/48), done.

$git commit -m "Add rsc/pdf as a submodule"
[master 2778170] Add rsc/pdf as a submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 pdf

git submodule在主倉庫的頂層目錄下創建一個.gitmodules文件:

$cat .gitmodules
[submodule "pdf"]
 path = pdf
 url = https://github.com/rsc/pdf.git

pdf子目錄下的.git不再是目錄而是一個文件,其內容指示了pdf倉庫的git元數據目錄的位置,即主倉庫下的.git/modules/pdf下:

$cat pdf/.git
gitdir: ../.git/modules/pdf

git submodule這種機制的主要用途是當多個項目之間有共享代碼時,避免將共享的代碼直接復制到每個項目中,而是通過Submodule來引用外部倉庫。這種方式使得共享代碼的版本控制更加明確和獨立,也方便了項目之間的更新、管理與版本控制。

通過git submodule status可以查看主倉庫下各個submodule的當前狀態:

$git submodule status
 c47d69cf462f804ff58ca63c61a8fb2aed76587e pdf (v0.1.0-1-gc47d69c)

通過git submodule update還可以更新各個submodule到最新版本。但通常在主倉庫中會鎖定Submodule的特定版本,通過鎖定Submodule的版本,可以確保主倉庫使用的是經過測試和驗證的Submodule代碼,這減少了因Submodule更新而導致的意外問題。同時,鎖定版本還可以確保所有開發者和構建環境都使用完全相同版本的Submodule,這對于保證構建的一致性和可重現性至關重要。版本鎖定讓你還可以精確控制何時更新Submodule,你可以在準備好處理潛在的變更和進行必要的測試時,有計劃地更新Submodule版本。submodule的版本鎖定可以通過下面命令組合實現:

cd path/to/submodule
git checkout <specific-commit-hash>
cd -
git add path/to/submodule
git commit -m "Lock submodule to specific version"

這個提交會更新主倉庫中記錄的Submodule版本,其他克隆主倉庫的人在初始化和更新Submodule時,就會自動獲取到這個特定版本。

在以Git為版本管理工具的項目中,Submodule在以下一些場景中還是很有用的:

  • 在多項目依賴場景下,我們可以使用Submodule共享公共庫;
  • 在大型單一倉庫中,Submodule有助于我們模塊化管理各個子項目;
  • 統一對Submodule的版本進行嚴格管理,避免在更新時引入未測試的新代碼。

submodule雖然可以解決一些問題,但由于增加了項目管理復雜度以及學習成本,應用算不上廣泛,但也不乏一些知名的開源項目在使用,比如git項目自身、openssl、qemu等。

不過,對于Go項目而言,Go Modules是Go在Go 1.11引入的新的官方依賴管理機制,它通過go.mod文件聲明依賴關系,通過go.sum文件確保依賴的完整性,實現了構建的可重現性。那么,在Go項目中還有必要引入sub modules嗎?

這里我們先不下結論,而是先來看看Go項目引入submodule后該如何使用呢。

2. Go項目的Git Submodule使用方法

在前面我們在本地建立了一個main-project,然后將rsc/pdf作為submodule導入到了main-project中,main-project是一個Go項目,它的go.mod如下:

// main-project/go.mod

module main-project

go 1.23.0

我們現在就繼續使用這個示例來看看Go項目中git submodule的使用方法。

我們先來看一種錯誤的使用方法:使用相對路徑。

我們在main-project下建立一個main.go的源文件:

// main-project/main.go

package main

import (
 _ "./pdf"
)

func main() {
 println("ok")
}

建完后,整個main-project的目錄布局如下:

$tree -F                         
.
├── go.mod
├── main.go
└── pdf/
    ├── LICENSE
    ├── README.md
    ├── lex.go
    ├── name.go
    ├── page.go
    ├── pdfpasswd/
    │   └── main.go
    ├── ps.go
    ├── read.go
    └── text.go

在第一版main.go中,我們期望使用相對路徑來導入submomdule中的pdf包,運行main.go,我們得到下面結果:

$go run main.go
main.go:4:2: "./pdf" is relative, but relative import paths are not supported in module mode

我們看到:在go module構建模式下,Go已經不再支持以相對路徑導入Go包了!但是如果我們直接通過rsc.io/pdf這個路徑導入,那顯然使用的就不是submodule中的pdf包了。

下面我們試試第二種方法,即將pdf目錄看成main-project的子目錄,將pdf包看成是main-project這個module下的一個包,這樣pdf包在main-project這個module下的導入路徑就變成了main-project/pdf:

// main-project/main.go
package main

import (
 _ "main-project/pdf"
)

func main() {
 println("ok")
}

這次構建和運行main.go,我們將得到正確的預期結果。

到這里,我們似乎又找到了go module之外go項目依賴管理的新方法,并且這種方法特別適合當某些依賴項目尚未發布,還無法直接通過Go Module導入的庫,甚至是一些永遠不會發布的內部庫或私有庫。這種方法讓pdf看起來是main-project的一部分,但實際上pdf包的版本卻是需要開發人員自己通過git submodule命令管理的,pdf包的版本無法用go.mod(和go.sum)控制,因為它被視為是main-project的一部分了,而不是外部依賴包。

如果你不想將其視為main-project的一部分,還想將其以外部依賴的方式管理起來,那就需要利用到go module的replace或go.work了。不過這種方法的前提是submodule下必須是一個go module,即有自己的go.mod。rsc.io/pdf包是一個legacy package,還沒有自己的go.mod,我們先在本地pdf目錄下為其添加一個go.mod:go mod init rsc.io/pdf。

接下來,我們先來簡單看看用replace如何實現導入pdf包,我們需要修改一下main-project/go.mod:

// main-project/go.mod

module main-project

go 1.23.0

require rsc.io/pdf v0.1.1

replace rsc.io/pdf => ./pdf

這里我們用replace指示符將rsc.io/pdf替換為本地pdf目錄下的go module,這樣修改后,我們運行main.go也會得到正確的結果。

另外我們還可以使用go.work來導入pdf,下面命令初始化一個go.work:

$go work init .

編輯go.work,添加workspace包含的路徑:

go 1.23.0

use (
 .
 ./pdf
)

這樣go編譯器會默認在當前目錄和pdf目錄下搜索rsc.io/pdf模塊,運行main.go也是ok的。

相對于將pdf包看成是main-project module下的一個包并用main-project/pdf這個內部依賴的包導入路徑的方法,使用replace或go.work的好處在于一旦pdf包得以發布,main.go可以無需修改pdf包導入路徑,并可以基于go.mod精確管理pdf包的版本。

3. 小結

那么我們在Go項目中到底是否有必要使用sub modules呢?我們來小結一下。

總的來說,在大多數情況下,Go Modules確實已經覆蓋了Git Submodule在Go項目中的主要功能,甚至做的更好,比如:Go Modules提供了更細粒度的版本控制,能自動解析和下載依賴,并也可以確保了構建的可重現性。因此,對于大多數Go項目而言,使用Go Modules已經足夠滿足依賴管理需求,而無需再使用git submodule。并且,在Go項目以及Go社區的實踐中,應對類似共享未發布的依賴包的場景(git submodule適用的場景),使用replace或go.work是比較主流的實踐,或者說go.work以及replace就是為了這種情況而添加的。

當然如果組織/公司內部尚未構建可以很好地支持內部Go項目間依賴包獲取、導入和管理的基礎設施,那么git submodule不失為一種可以在內部Go項目中實施的可行的依賴版本管理和控制方案。

最后,無論選擇使用Git Submodule、Go Modules,還是兩者結合,最重要的是要確保項目結構清晰,依賴關系明確,以便于團隊協作和項目維護。

責任編輯:武曉燕 來源: TonyBai
相關推薦

2023-10-30 08:16:33

數據庫插件Mybatis

2023-10-04 20:18:50

性價比SSDHDD

2022-08-16 14:17:50

數據倉庫數據治理數據職場

2024-08-19 01:10:00

RedisGo代碼

2013-05-13 10:03:04

git

2009-06-24 17:34:58

使用JSF的經驗

2018-08-17 08:51:24

2013-08-08 16:25:08

項目加班

2022-03-21 08:55:53

RocketMQ客戶端過濾機制

2022-07-26 01:00:12

Eureka延遲注冊

2023-04-17 09:32:29

IP地址MAC

2025-05-13 05:11:00

推理模型微調

2023-11-30 09:00:00

TypeScript開發

2021-12-05 21:05:49

前端JSON API

2020-08-18 08:09:55

Docker容器工具

2022-10-17 08:17:47

位掩碼Java變量

2017-07-04 19:02:17

ReacRedux 項目

2024-04-03 09:03:05

項目分支管理

2025-04-08 08:12:26

Next.js組件ChatGPT

2023-10-13 07:14:54

HDD存儲服務
點贊
收藏

51CTO技術棧公眾號

午夜精品福利一区二区三区蜜桃| 99视频在线观看视频| 亚洲一区二区三区四区五区六区| 国产免费av高清在线| 日韩三级网址| 国内久久婷婷综合| 亚洲欧美日韩一区在线| 日本中文字幕亚洲| 国产www视频| 久久国产电影| 色老头久久综合| 精品产品国产在线不卡| 麻豆91精品91久久久| 久久久精品一区二区毛片免费看| 26uuu色噜噜精品一区| 久久久久国产精品www| 亚洲第一成肉网| 丝袜诱惑一区二区| 97超碰欧美中文字幕| 97在线视频免费播放| 狠狠热免费视频| 免费在线毛片| 日本不卡高清视频| 中文字幕亚洲欧美| 一本色道久久亚洲综合精品蜜桃| 国产一级在线| 欧美aaaaaa午夜精品| 精品亚洲一区二区三区四区五区| 国产91xxx| 黄色美女一级片| 亚洲精华国产欧美| 日韩av最新在线| av免费中文字幕| porn亚洲| 国产乱淫av一区二区三区| 欧美精品在线视频观看| 深夜视频在线观看| 调教一区二区| 91香蕉视频黄| 岛国一区二区三区高清视频| 黄网在线观看视频| 欧洲激情综合| 日韩一级大片在线观看| 青草视频在线观看视频| 天堂网在线中文| 爽好多水快深点欧美视频| 中文字幕亚洲色图| 手机看片福利视频| 国产精品欧美一区二区三区不卡 | 欧美在线国产| 精品久久人人做人人爽| 欧美日韩激情视频在线观看| 久久久pmvav| 99re8在线精品视频免费播放| 97在线中文字幕| 四虎成人永久免费视频| 91综合久久| 亚洲第一天堂av| 天天操天天爱天天爽| 国产超碰精品| 樱花影视一区二区| 欧美三级电影在线播放| 国产男女猛烈无遮挡| 国产视频一区欧美| 日韩综合中文字幕| 奇米777第四色| 在线观看亚洲精品福利片| 亚洲6080在线| 播放灌醉水嫩大学生国内精品| 国产蜜臀av在线播放| 国产情人综合久久777777| 亚洲自拍另类欧美丝袜| 中文字幕黄色片| 欧美国产91| 高清视频欧美一级| av最新在线观看| 色天下一区二区三区| 欧美一区二区在线观看| 日本男人操女人| caoporn视频在线| 亚洲天堂av老司机| 日韩国产欧美精品| 天天躁日日躁狠狠躁喷水| 久久蜜桃香蕉精品一区二区三区| 99re视频在线观看| 中日韩在线观看视频| 国产农村妇女毛片精品久久莱园子| 97超级碰在线看视频免费在线看| 国产成人无码专区| 亚洲美女黄网| 日韩有码片在线观看| 精品欧美一区二区久久久久 | 精品亚洲一区二区三区在线观看| 成人国产精品久久久网站| 哺乳一区二区三区中文视频| 69久久99精品久久久久婷婷| 国产免费又粗又猛又爽| 成人性生活av| 激情懂色av一区av二区av| 男女爱爱视频网站| 老司机精品视频在线观看6| 久久精品日产第一区二区三区高清版| www.久久草| 黄色在线播放| 亚洲国产精品尤物yw在线观看| 国产日产欧美一区二区| 亚洲欧洲自拍| 欧美一级日韩不卡播放免费| 中文字幕av网址| 西野翔中文久久精品字幕| 最近2019中文字幕一页二页| 欧美做受高潮6| 狠久久av成人天堂| 欧美精品九九久久| 亚洲午夜在线播放| 麻豆精品国产传媒mv男同| 国产精品欧美日韩久久| 亚洲欧美日韩一区二区三区四区| 男人天堂欧美日韩| 日本视频久久久| 婷婷激情五月综合| 成人一区二区三区视频在线观看| 国产精品12| 日本在线看片免费人成视1000| 国产精品久久福利| 一级二级三级欧美| h网站久久久| 亚洲一区在线观看视频| 免费一级特黄毛片| 国产专区精品| 中文字幕亚洲综合久久筱田步美| 成人午夜视频精品一区| 日韩精品色哟哟| 国产欧美一区二区三区久久| 国产精品久久影视| 高清久久久久久| 久久综合狠狠综合久久综青草| 成人亚洲性情网站www在线观看| 亚洲成人一二三| 特种兵之深入敌后| 日韩三级视频| 国模视频一区二区三区| 亚洲av无码乱码国产精品| 91尤物视频在线观看| 免费网站永久免费观看| 国产精品专区免费| 日韩精品一二三四区| 国产污片在线观看| 视频一区中文字幕国产| 久久涩涩网站| 国产不卡在线| 欧美一区二区三区免费大片 | 熟妇人妻系列aⅴ无码专区友真希| 亚洲乱码国产乱码精品精98午夜| 国产日本在线播放| 国产伦精品一区二区三区免费优势| 国产婷婷成人久久av免费高清 | 欧美在线影院一区二区| 超碰在线超碰在线| 中文字幕精品影院| 欧美成人精品一区| 亚洲爱情岛论坛永久| 亚洲一二三区视频在线观看| 88av在线播放| 成人在线国产| 98视频在线噜噜噜国产| 午夜福利视频一区二区| 亚洲三级在线播放| 麻豆传媒在线看| 亚洲国产国产亚洲一二三| 狠狠久久综合婷婷不卡| 日韩不卡免费高清视频| 久久亚洲私人国产精品va| 国产第一页在线观看| 日本一区二区三区免费乱视频| 三级性生活视频| 国内黄色精品| 91国产精品91| 成人av影院在线| 99久久99久久精品免费看蜜桃 | 精品人妻少妇嫩草av无码专区 | 欧美日韩国产综合视频在线观看| 午夜视频在线免费看| 伊人久久大香线蕉综合热线| 国产女精品视频网站免费| 三级视频在线看| 色婷婷综合在线| 欧亚乱熟女一区二区在线| 久久久久国产精品一区三寸| 亚洲午夜精品久久久中文影院av| 日韩一区二区三区精品视频第3页| 午夜精品久久久久久久久久久久久| 欧美日韩激情视频一区二区三区| 欧美浪妇xxxx高跟鞋交| 亚洲色图日韩精品| 媚黑女一区二区| 国产免费色视频| 日韩电影大全网站| 萌白酱国产一区二区| 亚洲日本国产精品| 欧美二区三区的天堂| xxxx.国产| 亚洲日本va在线观看| 男女黄床上色视频| 国产成人午夜视频| 日本高清视频免费在线观看| 国产精品一区二区免费福利视频| 欧美激情国产精品| 国产综合无码一区二区色蜜蜜| 在线观看视频一区| 国产在线综合网| 中文字幕日韩欧美一区二区三区| 小明看看成人免费视频| 欧美色网址大全| 国产精品日韩二区| 国产在线观看www| 亚洲加勒比久久88色综合| 欧美日韩免费做爰视频| 亚洲国产精品成人综合| wwwwwxxxx日本| 国产日韩综合| 日本阿v视频在线观看| 国产精品91一区二区三区| 96国产粉嫩美女| 免费高清视频在线一区| 中文字幕日韩av电影| 五十路在线视频| 精品少妇一区二区三区| 国产剧情精品在线| 欧美撒尿777hd撒尿| 看免费黄色录像| 成人一区二区视频| 无码国产精品一区二区高潮| 老司机免费视频一区二区三区| 国产aaa一级片| 国产精品久久777777毛茸茸| 欧美精品自拍视频| 中文字幕一区二区三区欧美日韩| 国产精品久久久对白| 精品一区二区三区免费看| 国模私拍一区二区三区| 污的网站在线观看| 免费成人高清视频| v片在线观看| 久久视频精品在线| 黄色在线视频网站| 久久精品视频导航| 天天色综合av| 亚洲加勒比久久88色综合 | 日韩美女av在线| 五月天婷婷在线播放| 亚洲黄页网在线观看| 天堂在线资源库| 亚洲精品中文字| 免费在线观看污视频| 亚洲亚裔videos黑人hd| 国产激情久久久久久熟女老人av| 7777女厕盗摄久久久| 国产精品视频一二区| 欧美一区二区精品久久911| 精品久久人妻av中文字幕| 日韩美女视频在线| 一级黄色在线观看| 欧美日韩在线直播| 国产伦精品一区二区三区视频痴汉| 91麻豆精品国产无毒不卡在线观看 | 偷拍一区二区三区四区| 天天插天天操天天干| 91精品91久久久中77777| 亚洲一区中文字幕在线| 欧美日韩亚洲视频| 538精品在线视频| 国产视频一区二区在线| 丁香六月激情综合| 亚洲美女免费在线| 黄色一级片免费看| 日本精品一区二区三区高清| 亚洲天天综合网| 欧美成人aa大片| 免费毛片在线| 欧美xxxx18国产| 国内激情视频在线观看| 国产精品av电影| 超碰一区二区| 成人h猎奇视频网站| 日韩毛片免费观看| 成人激情视频网| 美女视频免费精品| 国产一区精品视频| 亚洲码欧美码一区二区三区| 91免费精品视频| 日韩深夜福利网站| 国产玖玖精品视频| 亚洲精品国产九九九| 欧美一区二区三区在线免费观看| 麻豆一区一区三区四区| 亚洲无玛一区| 影音先锋久久资源网| 在线看的黄色网址| 成人高清在线视频| 亚洲欧美卡通动漫| 中文字幕在线一区免费| 国产一级理论片| 欧美日韩美少妇| 亚洲欧洲精品视频| 免费99精品国产自在在线| 免费日韩电影| 国产一区二区三区四区五区在线 | 欧美人妖在线观看| 久久影视中文粉嫩av| 亚洲精品国产成人影院| 日韩第一页在线观看| 亚洲伊人网站| 老司机午夜av| 成人国产免费视频| 99鲁鲁精品一区二区三区| 色老综合老女人久久久| 日韩在线观看视频网站| 亚洲国产高清高潮精品美女| 免费a级毛片在线播放| 美日韩丰满少妇在线观看| 精品成人av| 成人午夜在线影院| 精品美女在线视频| 欧美 国产 小说 另类| 播五月开心婷婷综合| 久久久久免费看| 欧美午夜片欧美片在线观看| 999视频在线| 日韩成人在线播放| 波多野结衣视频一区二区| 国产精品毛片一区视频| 午夜精品av| 激情成人在线观看| 亚洲啪啪综合av一区二区三区| 中国a一片一级一片| 亚洲人成网7777777国产| yourporn在线观看中文站| 人体精品一二三区| 亚洲伊人精品酒店| 中文网丁香综合网| 伊人久久综合| 久久久久亚洲av无码专区首jn| 国产精品美女一区二区| 久久精品国产亚洲AV无码麻豆 | 天天操天天射天天| 韩国美女主播一区| 欧美sss在线视频| 国产成人在线免费看| 99久久精品国产一区二区三区| 日韩av无码中文字幕| 欧美三级中文字| av播放在线| 欧美激情中文字幕在线| 成人看片爽爽爽| 91丨porny丨探花| 91天堂素人约啪| 欧美一区二区三区不卡视频| 亚洲天堂2020| 激情久久99| mm131午夜| 成人免费观看视频| 中文字幕超碰在线| 中文字幕亚洲欧美日韩高清| 疯狂欧洲av久久成人av电影| 真实国产乱子伦对白视频| 99久久精品免费| 依依成人在线视频| 久久国产视频网站| 国产精品白浆| 欧洲熟妇精品视频| 成人欧美一区二区三区视频网页| 国产福利小视频| 青青草一区二区| 99精品小视频| 中文在线观看免费视频| 欧美在线免费视屏| av网站在线免费看推荐| 国产精品一区久久| 欧美在线高清| 人妻无码一区二区三区| 亚洲高清久久久| 邻居大乳一区二区三区| 91精品久久久久久久久久久久久| 国产主播一区| 九九九视频在线观看| 一本一道综合狠狠老| 日本在线观看网站| 国产一区精品视频| 久久99久久久欧美国产| 国产精品成人在线视频| 精品精品欲导航| jizz亚洲女人高潮大叫| 日韩精品在在线一区二区中文| 国产在线一区观看| 亚洲欧美综合7777色婷婷| 精品国精品国产| 国产精品久久乐| 日本福利视频在线| 亚洲欧美偷拍卡通变态|