精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产性生活视频| 在线中文字日产幕| 成人国产免费电影| 福利电影一区二区| 97视频在线观看成人| 欧美 日本 国产| 97精品国产99久久久久久免费| 国产精品不卡在线| 春色成人在线视频| 日本韩国欧美中文字幕| 天天揉久久久久亚洲精品| 日韩免费观看高清完整版| 欧美色图另类小说| a在线免费观看| 91麻豆国产福利在线观看| 国产在线日韩在线| 国产成人愉拍精品久久 | 国产日韩一区二区三区| 黄色一级视频免费看| 一区二区电影在线观看| 亚洲一区www| 亚洲午夜久久久久久久久| 电影一区二区| 欧美视频中文在线看| 午夜啪啪福利视频| 东热在线免费视频| 99久久久久免费精品国产 | 成人香蕉社区| 在线综合+亚洲+欧美中文字幕| 国产免费黄色一级片| 在线视频自拍| 国产视频一区二区在线观看| 国产三级精品在线不卡| 精品乱子伦一区二区| 奇米一区二区三区av| 2021久久精品国产99国产精品| 少妇被躁爽到高潮无码文| 欧洲三级视频| 国产香蕉精品视频一区二区三区| 免费日本黄色网址| 中文一区二区三区四区| 欧美一区二区黄| 久久久久xxxx| 成人一区视频| 欧美午夜片欧美片在线观看| av免费观看国产| 欧洲成人综合网| 一区二区在线观看免费| mm131午夜| 国产写真视频在线观看| 中文字幕在线观看一区| 亚洲日本精品一区| 91社区在线观看播放| 国产三级精品视频| 特级西西444www大精品视频| 久久久久国产精品嫩草影院| 91视频免费看| 欧美高清视频一区二区三区在线观看| 午夜小视频在线播放| 成人美女在线观看| 激情五月综合色婷婷一区二区| 狠狠人妻久久久久久综合麻豆| 高清成人在线观看| 激情久久av| 欧美日本韩国一区二区| 国产欧美视频在线观看| 亚洲图片在线观看| 免费a级在线播放| 亚洲免费av网站| 日韩一区二区高清视频| 激情av在线| 精品久久久一区二区| 日韩精品一区二区三区久久| 性欧美18一19sex性欧美| 在线视频一区二区三区| 欧美丝袜在线观看| 亚洲综合网站| 精品一区二区亚洲| 91精品国自产在线| 无需播放器亚洲| 欧美—级a级欧美特级ar全黄| 日本熟妇毛茸茸丰满| 亚洲欧美日韩视频二区| 国产精品久久电影观看| 国产精品免费无遮挡| 高清久久久久久| 欧美性色黄大片人与善| 日本福利专区在线观看| 夜夜嗨av一区二区三区四季av| xxxx18hd亚洲hd捆绑| 第四色男人最爱上成人网| 91麻豆精品国产91久久久久久 | 国产97在线 | 亚洲| 欧美羞羞视频| 日韩一区二区在线看| 日本一区二区在线免费观看| 欧美亚洲精品在线| 久久久久久久成人| 日韩欧美国产另类| 成人性视频免费网站| 日韩欧美视频第二区| av理论在线观看| 一本大道av伊人久久综合| 樱花草www在线| 亚洲福利天堂| 欧美激情欧美狂野欧美精品 | 国产丝袜精品丝袜| 欧洲av一区二区嗯嗯嗯啊| 日本wwwxx| 日韩电影免费网址| 91po在线观看91精品国产性色| 亚洲天堂777| 91香蕉视频污在线| 日本a级片在线播放| 88xx成人永久免费观看| 亚洲高清久久网| 免费黄色激情视频| 丝袜诱惑亚洲看片| 精品国产乱码久久久久软件 | blacked蜜桃精品一区| 色中色综合影院手机版在线观看 | 91制片在线观看| 欧美精品第1页| 老熟妇一区二区| 亚洲一区二区毛片| 成人欧美一区二区三区在线观看 | 97超碰免费在线观看| 国模精品一区| 欧美亚洲成人精品| 黄色av中文字幕| 亚洲免费观看在线观看| 亚洲天堂国产视频| 波多野结衣在线观看一区二区| 7777精品视频| 人人妻人人澡人人爽人人欧美一区| 中文字幕一区二区5566日韩| 国产精品乱码久久久久| 亚洲动漫在线观看| 日本精品一区二区三区在线 | 中文字幕综合在线| 国产男人搡女人免费视频| 91美女蜜桃在线| 免费无遮挡无码永久视频| av在线亚洲色图| 欧美激情视频网| 亚洲风情第一页| 亚洲靠逼com| 欧美激情国内自拍| 综合国产精品| 97se亚洲综合| 牛牛精品在线视频| 精品蜜桃在线看| 久久精品无码人妻| 不卡的av电影| 欧美爱爱视频免费看| 欧美男男freegayvideosroom| 欧美精品999| 四季av日韩精品一区| 亚洲成av人影院| 成年人在线观看av| 视频在线观看91| 亚洲欧美久久234| 青青伊人久久| 欧美区二区三区| 日本激情一区二区| 色偷偷成人一区二区三区91| 国产1区2区在线观看| 精品无人区卡一卡二卡三乱码免费卡| 异国色恋浪漫潭| 亚洲一区二区电影| 97在线观看视频| 国产高清在线| 7777精品伊人久久久大香线蕉| 日韩成人短视频| 国产91对白在线观看九色| 日本中文字幕网址| 精品日韩毛片| 91精品国产高清久久久久久91裸体 | 国产欧美1区2区3区| gai在线观看免费高清| 午夜天堂精品久久久久| 精品蜜桃传媒| 成人在线免费av| 久久91超碰青草是什么| 天天综合在线视频| 在线观看亚洲成人| 九九热视频精品| 久久精品网站免费观看| 天堂av2020| 国产精品人人爽人人做我的可爱| 日本一区网站| 欧一区二区三区| 国产91九色视频| 在线播放蜜桃麻豆| 精品视频久久久久久久| 国产又粗又长又大视频| 精品久久久久久电影| 少妇高潮在线观看| 99久久99久久精品国产片果冻| 国产九九在线观看| 日韩午夜电影| 男人草女人视频| 精品国内自产拍在线观看视频| **亚洲第一综合导航网站| 日韩大片欧美大片| 久久99久久99精品免观看粉嫩| 国产69久久| 亚洲精品一区在线观看| 亚洲怡红院av| 欧美日韩一区二区免费视频| 欧美色图一区二区| 中文字幕欧美激情一区| 日韩片在线观看| 国产精品18久久久| 999精彩视频| 香蕉成人久久| 久久国产精品网| 综合天堂av久久久久久久| 欧美一进一出视频| 欧美18xxxx| 国产福利久久精品| 精品国产三区在线| 国产精品一区久久久| 自拍偷自拍亚洲精品被多人伦好爽| 久久久久久成人| av免费在线观| 精品国产欧美一区二区五十路| 国产午夜精品一区理论片| 亚洲精品久久久久国产| 亚洲成人777777| 欧美一级欧美一级在线播放| 亚洲中文字幕在线观看| 欧美中文字幕一二三区视频| 天堂网av手机版| 亚洲成人久久影院| 九九热国产视频| 亚洲大型综合色站| 国产在线拍揄自揄拍无码视频| 亚洲欧美激情一区二区| 国产成人av免费在线观看| 国产精品国产a| 黄色三级生活片| 国产农村妇女精品| 国产精品www爽爽爽| 国产三级精品三级| 国产精品麻豆免费版现看视频| 欧美国产亚洲另类动漫| 欧美老女人性生活视频| 国产日韩欧美电影| 9.1片黄在线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧洲xxxxx| 亚洲精品一区二区妖精| 日韩第一页在线观看| 婷婷久久国产对白刺激五月99| 在线观看欧美一区| 天堂网在线观看国产精品| 亚洲欧美日韩不卡| 午夜精品视频| 超碰成人免费在线| 国产视频一区三区| 欧在线一二三四区| 免费亚洲电影在线| 日韩av自拍偷拍| 国产成人免费视频网站| 国产人妻黑人一区二区三区| 99久久婷婷国产精品综合| 大又大又粗又硬又爽少妇毛片 | 国产高清成人在线| youjizz.com日本| 久久综合色婷婷| 亚洲色图 激情小说| 自拍偷拍欧美激情| 国产精品.www| 91福利在线看| 国产片在线播放| 亚洲电影免费观看高清完整版在线观看 | 日韩欧美亚洲区| 小处雏高清一区二区三区| a级黄色片免费| 免费在线成人| 亚洲精品免费一区亚洲精品免费精品一区 | 污污视频在线观看网站| 国产亚洲aⅴaaaaaa毛片| 国内精品久久久久久野外| 国内揄拍国内精品少妇国语| 久久野战av| 成人毛片网站| 国产成人一区| 日本香蕉视频在线观看| 老司机精品视频网站| 国产黄色一区二区三区| 久久精品人人做| 欧美精品xxxxx| 91国产福利在线| 国产成人手机在线| 在线a欧美视频| 激情视频网站在线播放色| 国产精品爽爽爽| 久久悠悠精品综合网| 最新av在线免费观看| 久久午夜电影| 理论片大全免费理伦片| 中文字幕亚洲电影| 人妻 日韩精品 中文字幕| 日韩视频免费观看高清完整版| 激情综合闲人网| 97精品视频在线播放| 外国成人毛片| 青娱乐一区二区| 日韩午夜免费| 麻豆传媒在线看| 国产精品乱人伦| 伊人久久久久久久久久久久| 精品捆绑美女sm三区| 欧美jizzhd欧美| 国产精品18久久久久久麻辣| 成人h动漫免费观看网站| 欧美日韩亚洲国产成人| 日本欧美一区二区| 精品夜夜澡人妻无码av| 亚洲电影第三页| www.日韩在线观看| 久久久精品国产亚洲| 韩国成人在线| 欧美一区观看| 香蕉久久夜色精品国产| 97精品人妻一区二区三区蜜桃| 综合自拍亚洲综合图不卡区| 日本欧美www| 亚洲视频在线观看| 亚洲三级欧美| 久久久水蜜桃| 国产精品试看| 青青草视频成人| 精品久久久精品| 日本免费不卡| 欧洲一区二区视频| 日本韩国欧美超级黄在线观看| a级黄色一级片| 99久久综合精品| 日韩成人免费在线观看| 日韩精品一区二区三区在线播放| 国产美女av在线| 亚洲va男人天堂| 中文字幕日韩一区二区不卡 | 国产成人艳妇aa视频在线| 国模一区二区三区白浆| 欧美精品久久久久久久久46p| 欧美精品日韩一区| 国产高清一区二区三区视频 | 色先锋久久影院av| www.com毛片| 国产婷婷色一区二区三区| 做爰视频毛片视频| 日韩一中文字幕| 久久久久久久久久久久电影| 日韩亚洲欧美一区二区| av电影在线观看一区| 亚洲男人的天堂在线视频| 亚洲国产小视频| 电影一区二区三| 亚洲乱码国产乱码精品天美传媒| 麻豆免费精品视频| 日本a级片视频| 亚洲精品国精品久久99热| 吞精囗交69激情欧美| 亚洲一卡二卡区| 国产传媒久久文化传媒| 奇米影视第四色777| 亚洲欧美日韩另类| 久久91视频| 人人妻人人澡人人爽欧美一区| 99视频热这里只有精品免费| 蜜臀精品一区二区三区| 久久精品91久久香蕉加勒比| 白嫩白嫩国产精品| 欧美三级午夜理伦三级| 国产精品美女久久久久高潮| 999免费视频| 97视频国产在线| 97欧美在线视频| 制服丝袜在线第一页| 色婷婷综合久久久| a毛片在线看免费观看| 久久久久网址| 国产在线麻豆精品观看| 天海翼一区二区| 久久九九全国免费精品观看| 精品淫伦v久久水蜜桃| 中文字幕第100页| 亚洲成av人片| 日本在线看片免费人成视1000| 国产精选一区二区| 蜜臀av亚洲一区中文字幕| 日本五十路女优| 久久久国产精品亚洲一区| 日韩a级大片| 亚洲国产综合av| 欧美三电影在线|