天天看點

配置GOPRIVATE引用私有倉庫現象原因解決方式參考

現象

在使用gomod模式管理golang包的時候,下載下傳開源的公共包還可以,但是一旦使用内部或者私有的包,就可能會出現如下所示的問題:

server response: not found: git.xxx.com/xxxxxx/[email protected]: unrecognized import path "git.xxx.com/xxxxxx/xxx": https fetch: Get "https://git.xxx.com/xxxxxx/xxx?go-get=1": dial tcp xx.xx.xx.xx:443: connect: connection refused
           

原因

究其原因,一方面使用如下GOPROXY代理的方式,隻能管理開源的golang包及依賴;另一方面,私有的倉庫中的項目,需要配置相應的使用者權限才能通路,并且通常需要配置跳過相關私有倉庫。

GOPROXY="https://goproxy.cn,direct"
           

Windows系統使用以下指令設定GOPRIVATE為私有倉庫位址:

set GOPRIVATE="git.xxx.com"
// 或者go env -w GOPRIVATE="git.xxx.com"
// 或者env:GOPRIVATE="git.xxx.com/"
           

PS:在指令行中,通過set GOPRIVATE的指令方式,隻在目前指令行有效,換個編輯器,使用go env指令檢視環境變量,發現還是沒有設定,這時候就需要右鍵[我的電腦]設定該環境變量。

其中,git.xxx.com為私有倉庫位址,在解析的時候使用使用字首比對的方式,所有的git.xxx.com位址中的所有項目都會被視為private-modules。配置該方式後,對于企業、私有Group等,隻要代碼倉庫位址不變、屬于項目組、并且有權限,配置一次就可以無限次拉取該私有倉庫中的所有項目。

Linux設定方式,在terminal中輸入以下指令:

export GOPRIVATE=git.xxx.com/
           

其中,git.xxx.com替換為具體的私有倉庫域名。

解決方式

  1. 檢查GO111MODULE是否打開

通過go env指令檢視GO111MODULE配置是否打開,go 1.12及以下的版本需要配置如下環境變量打開GO111MODULE,go 1.13及以上的版本預設是打開的。

GO111MODULE=on 
           
  1. 設定代理環境變量
GOPROXY="https://goproxy.cn,directt"
// 或者也可以設定為 GOPROXY="https://goproxy.io,direct"
           
  1. 配置私有倉庫域名
GOPRIVATE="git.xxx.com" (引号裡替換公司私有庫域名)
           
  1. 檢查git config配置是否正确
git config -l 檢視git的所有配置
           

如果git沒有配置使用者資訊,可以通過如下指令設定。

git config --global user.name="xxx" 
           

注意:也可以使用git config --global user.name “xxx” 指令設定使用者名,一般是git賬戶的郵箱字首,使用global user.email指令設定郵箱,一般隻需設定一個使用者名即可。

  1. 将下載下傳代碼方式由http改為ssh

執行如下指令将擷取倉庫項目的方式由http或https改為ssh。

git config --global url."ssh://[email protected]:port/".insteadOf "https://git.xxx.com/"
           

由于go install、go mod tidy 指令下載下傳依賴的時候是通過git指令去下載下傳的,而且預設使用http或https協定,上面使用指令修改為ssh協定去擷取。

  1. 檢視包之間的依賴關系與權限

在拉取私有包,可以使用-x參數擷取詳細資訊,例如go get -x git.xxx.com/xxx,檢視是否存在包與包之間的依賴關系。

go get -x git.xxx.com/xxx
           

PS:有些私有包可能沒有權限,也會導緻擷取依賴包失敗。

  1. 使用go mod tidy管理go mod依賴
go mod tidy
           

設定完上面的配置後,如果通過go mod tidy或者go get -x 所需要下載下傳的私有包 指令後,出現下面的資訊:

go: git.xxx.com/go-xxx/[email protected]: unknown revision v0.xxx.0
           

或者

go get: module git.xxx.com/xxx/xxxxxx: git ls-remote -q origin in D:\Go1.16\gopath\pkg\mod\cache\vcs\xxxexxxxxx666xxxx8888xxx: exit status 128:
        Host key verification failed.
        fatal: Could not read from remote repository.

        Please make sure you have the correct access rights
        and the repository exists.
           

可能是因為在配置GOPRIVATE和SSH方式下載下傳私有包之前已經通過git clone http或https的方式下載下傳過,導緻包沖突,把原來下載下傳的包删除,再重新執行git clone ssh://[email protected]:port/xxxxxx/xxxxx.git的ssh方式下載下傳私有包,然後通過go get -x git.xxxxxx.com/xxxxx或者go mod tidy指令重新下載下傳依賴。

參考

Go填坑之将Private倉庫用作module依賴

go mod依賴離線安裝_go mod 安裝依賴 unkown revision問題解決

使用git config --global設定使用者名和郵件