引言:
一般通過 go get
拉取的是公共倉庫的代碼(如: github.com中的代碼),是不需要任務權限就能拉下來。但當我們配置的私有倉庫一般都需要用戶名密碼來登錄才能拉取代碼,所以私有倉庫主要是解決認證問題。
了解 go get
在早期版本的Go中,“go get”用于構建和安裝包。現(xiàn)在,“go get”專門用于調整go.mod中的依賴項,即下載所需要的包。'go install'可以用來構建和安裝命令。go get
通常也是使用 git、svn等工具進行拉取所需要的包。怎么決定使用哪個工具呢?
1. 通過靜態(tài)方式
1.1 通過倉庫域名
例如:go get github.com/example/pkg
域名為github.com
go就直接使用 git 工具進行拉取。
1.2 通過后綴
例如:go get github.com/example/pkg.git
后綴為.git
,也直接使用 git 工具進行拉取。
2. 通過動態(tài)方式
選擇動態(tài)方式是因為域名和后綴都無法判斷倉庫類型,所以一般私有的倉庫會使用動態(tài)方式。
通過在go get 命令中加 -v參數(shù)能夠看到將請求的結果
go get -v git.test.com/example/pkg
2.1 詢問倉庫
go get 時,go 會先使用 //git.test.com/example/pkg?go-get=1
請求再從結果中判斷使用哪個工具拉取。
2.2 分析結果
返回結果如下:
<html>
<head>
<meta name="go-import" content="git.test.com/example/pkg git http://git.test.com/example/pkg.git" />
<meta name="go-source" content="git.test.com/example/pkg http://git.test.com/example/pkg http://git.test.com/example/pkg/-/tree/master{/dir} http://git.test.com/example/pkg/-/blob/master{/dir}/{file}#L{line}" />
</head>
<body>go get http://git.test.com/example/pkg</body>
</html>
其中:<meta name="go-import" content="git.test.com/example/pkg git http://git.test.com/example/pkg.git" />
的content
的值分3段,格式為:
<meta name="go-import" content="root-path vcs repo-url" />
-
root-path: 模塊名字,如:
git.test.com/example/pkg
-
vcs: 使用的管理工具,如: git
-
repo-url:指的是模塊原代碼存放在哪個倉庫下面,該倉庫就需要是協(xié)議加倉庫地址的形式。如:
http://git.test.com/example/pkg.git
那么go就知道使用哪個工具拉取包了。
git認證
知道從哪里拉取、怎么拉取,正常就可以拉取go包了,但私有倉庫需要git認證。git拉取代碼認證的方式有3種:
URI的完整格式:
schema://username:password@host:port?query#fragment
?
schema: 協(xié)議,如http/https/ftp等
?
username: 用戶名
?
password: 密碼
?
host: ip或域名
?
port: 端口
?
query: 查詢字符串
?
fragment: 錨點
1. 用戶名、密碼
需要在拉取時輸入用戶名密碼,但go get時禁止交互(彈框,提示輸入用戶名密碼),我們可以參考URI格式使用 URL中添加用戶名密碼,即可。但我們go get時也沒辦法去改這個呀,后面介紹使用 git的 insteadof解決。
如:http://root:passpwd@git.test.com/example/pkg
2. 用戶名、access token(推薦使用)
作用和功能同1中的用戶名、密碼。只是一般用戶名密碼是用來登錄的,如果把密碼暴露了(因為這種認證會保存在git配置中,后面會介紹)就不太好了,本來只想讓程序去拉取一個倉庫代碼,結果別人知道密碼了,直接登錄上去了。token生成時是可以設置權限的,更為安全,使用在拉取代碼時只給 read_repository
權限即可。
3. ssh
可以在本地創(chuàng)建非對稱的加密對(ssh-keygen)。把公鑰放到倉庫里面去。
git的insteadof
git的insteadof在拉取代碼,發(fā)送請求前替換請求地址。格式如下:
git config --global url."https://$GIT_USER:$GIT_TOKEN@$GOPRIVATE".insteadOf "https://$GOPRIVATE"
表示在請求 https://$GOPRIVATE
倉庫時,會被替換成 https://$GIT_USER:$GIT_TOKEN@$GOPRIVATE
,即包含了用戶名和密碼,所以會拉取成功。
注:必須設置成 --global 與 --system,git 支持 --global、--local、--system。
-
--system 作用范圍太大了,此機器的其他用戶或項目都使用了此設置。
-
--local只能針對當前項目(所以必須在項目所在目錄,它會找.git目錄中的設置),go使用git命令時目錄可能存在問題?!疚打炞C】
例如:
git config --global url."https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com".insteadOf "http://git.test.com"
表示在請求http://git.test.com
私有倉庫的包時會被替換成https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com
,這里的root
是倉庫的用戶名,VUQsGPQdxy5CDQ9xEs24
是access token,
注:網(wǎng)上有人說 insteadOf后面的域名必須帶 /
即http://git.test.com/
,insteadOf前端字符串必須帶:
,即:https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com:
??赡苁瞧脚_或配置原因。根據(jù)自己的實際情況替換即可。
例如:
go get -v git.test.com/example/pkg 前,先通過 //git.test.com/example/pkg?go-get=1 進行訪問,看返回的頁面的實際協(xié)議,如我這里body中的:go get http://git.test.com/example/pkg
那么說明我的go get git.test.com/example/pkg
將被替換為`go get http://git.test.com/example/pkg
(注:go 自動完成)
這時我需要將用戶名和access token,添加上,所以要把 http://git.test.com
替換為https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com
(需要我們手動配置git config)
最終替換完的結果將是:https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com/example/pkg
這時go會使用最終的地址進行git clone https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com/example/pkg
完整流程
-
1.
在GOPRIVATE環(huán)境變量中加入私有倉庫地址。
go env -w GOPRIVATE=git.test.com
此時另外兩個GO的環(huán)境變量正常也會自動被設置與GOPRIVATE設置的值相同:(如果沒有改過來,請自行檢查并修改)
set GONOPROXY=git.test.com # 拉取git.test.com時不使用GOPROXY代理服務器 set GONOSUMDB=git.test.com # 拉取包成功后不進行簽名校驗,因為我們的私有庫沒有生成簽名
-
2.
設置git config地址替換
git config --global url."https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com".insteadOf "http://git.test.com"
這個設置會被保存在git全局的配置文件中。如我的window位置為:
C:\Users\lxz\.gitconfig
文件內容如下:
...省略不相關的配置 [url "https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com"] insteadOf = http://git.test.com
小知識點:引號中的內容會被設置在配置項目名稱后面,中括號內(如:
https://root:...
),不帶引號被設置在配置項內部(如:insteadOf
) -
3.
進行拉取即可
go get git.test.com/example/pkg
其他
1. 有時候配置了 git config 的insteadOf 后還是不好使,可能是因為之前設置過,需要把之前的刪除。
先查看所有設置
> git config --global -l
# 結果顯示
...省略不相關的配置
url.https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com.insteadof=http://git.test.com
...省略不相關的配置
再進行刪除(復制=號之前的所有字符串)
git config --global --unset url.https://root:VUQsGPQdxy5CDQ9xEs24@git.test.com.insteadof
2. 憑證管理
git憑證管理和git本身是兩個獨立的程序,憑證管理工具位置有git安裝目錄中,例如我的目錄C:\Program Files\Git\mingw64\libexec\git-core
下會有:
git-credential-cache.exe
git-credential-cache--daemon.exe
git-credential-manager-core.exe
git-credential-store.exe
git-credential-wincred.exe
查看git使用的憑證管理工具:
> git config --list
...省略不相關的配置
credential.helper=manager-core
credential.helper=store
...省略不相關的配置
Git 甚至允許你配置多個輔助工具。 當查找特定服務器的憑證時,Git 會按順序查詢,并且在找到第一個回答時停止查詢。 當保存憑證時,Git 會將用戶名和密碼發(fā)送給?所有?配置列表中的輔助工具,它們會按自己的方式處理用戶名和密碼。
注意,這里的manager-core
和store
分別對應目錄C:\Program Files\Git\mingw64\libexec\git-core
下的git-credential-manager-core.exe
和git-credential-store.exe
。當然你也可以自己寫一個輔助工具,放在這個目錄里。例如你開發(fā)一個:foo
的工具,你設置時使用git config --global credential.helper foo
,你的文件名稱應該為:git-credential-foo.exe
git-credential-manager-core.exe
是微軟開發(fā)的工具,它把憑證保存在了windows的憑證管理中。控制面板\用戶帳戶\憑證管理\管理windows憑證
中。所以有時有的人把 git config中的insteadof已經(jīng)刪除了,但還可以正常拉取。是因為系統(tǒng)已經(jīng)把憑證保存起來了,我們拉取代碼的時候git自動從憑證管理功能中獲取到憑證,再拼接上進行請求。
3. go mod cache
go get 拉取代碼時后在$GOPATH/pkg/下生成緩存,而且會有2級緩存。
第1級緩存:首先會在$GOPATH/pkg/mod/cache目錄中下載所需要的包,以壓縮所格式保存。
第2級緩存:在$GOPATH/pkg/mod中解壓cache中的包,放在與cache目錄同級。
這樣我們 go get 時會先檢查第2級緩存,如果不存在,再去檢查第1級緩存,如果都不存在再連網(wǎng)去倉庫拉取包,并生成緩存。
可以手動刪除緩存或通過命令(命令會將整個$GOPATH/pkg/mod目錄刪除):
go clean -modcache
所以有時在認證后拉取的包緩存在了本地,即使認證的access token或密碼修改了,再go get或go mod tidy時也可以成功使用包,也可能是使用了之前的緩存。
參考文章
Git - 憑證存儲
Git 憑據(jù)保存、如何修改_git憑據(jù)怎么設置_薛瑄的博客-CSDN博客
私有化倉庫的 GO 模塊使用實踐 - 知乎
Go Modules Reference - The Go Programming Language
點擊查看更多文章文章來源:http://www.zghlxwxcb.cn/news/detail-792975.html
更新精彩文章請關注微信公眾號:大胡幾哥哥文章來源地址http://www.zghlxwxcb.cn/news/detail-792975.html
到了這里,關于一篇文章徹底弄懂Golang私有倉庫配置問題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!