簡體   English   中英

如何在另一個私有 Go 項目(作為模塊)中導入私有 Go 庫(作為模塊)

[英]How to import a private Go library (as module) within another private Go project (as module)

我正在將一些私有 Go 項目移至 GitLab,同時擺脫Godeps 、帶有vendor目錄的 Go dep以及所有這些,因為我只想使用 Go 模塊。

我使用的是 Go 版本: go1.12.6 linux/amd64

  • 我在gitlab.com/my-company/my-team/my-library有一個私人“圖書館”項目/git 存儲庫。 這與go.modgo.sum一起用作 Go 模塊。
  • 我想使用my-library作為另一個項目的依賴項,這個: gitlab.com/my-company/my-team/my-project

URL 的結構是相同的,唯一改變的是存儲庫的名稱。

my-project導入my-library時遇到各種錯誤。

  • 如何將 Go 模塊作為私有存儲庫導入其他 Go 模塊作為私有存儲庫?
  • 下面的命令輸出有什么問題?

我知道 GitLab 令牌有效,因為go get命令自己計算出my-library的提交 ID。 無論如何,我已經完成了以下操作(參見https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html ):

git config \
  --global \
  url."https://token_name:token_val@gitlab.com".insteadOf \
  "https://gitlab.com" 

這些是錯誤消息:

$ go get -u gitlab.com/my-company/my-team/my-library.git
go: finding gitlab.com/my-company/my-team/my-library.git latest
go: gitlab.com/my-company/my-team/my-library.git@v0.0.0-20190802120216-712a10fb5fac: parsing go.mod: unexpected module path "gitlab.com/my-company/my-team/my-library"
go get: error loading module requirements
$ 
$ go get -u gitlab.com/my-company/my-team/my-library
go get gitlab.com/my-company/my-team/my-library: git ls-remote -q https://gitlab.com/my-company/my-team.git in /home/foo/Development/go-workspace/pkg/mod/cache/vcs/9be637426eac43b329899d57d9375d12246f2cc0f6ddd098446bc42ed1ca534d: exit status 128:
    remote: The project you were looking for could not be found.
    fatal: repository 'https://token_name:token_val@gitlab.com/my-company/my-team.git/' not found
$ 
$ GO111MODULE=off go get -u gitlab.com/my-company/my-team/my-library.git
package gitlab.com/my-company/my-team/my-library.git: no Go files in /home/foo/Development/go-workspace/src/gitlab.com/my-company/my-team/my-library.git
$
  • 第一次嘗試是我認為我應該使用的嘗試,但它不起作用,我不知道為什么。
    • 我認為這是因為不知何故在項目中已經存在這樣的依賴項。 但是當執行go mod graph | grep gitlab go mod graph | grep gitlab我發現一個空的輸出,即沒有沖突的依賴。
  • 可能要避免第二次嘗試,因為 URL 不以.git結尾,並且(出於某種我不明白的原因)URL 在my-team級別被剪切。
  • GO111MODULE=off似乎強制go get檢查$GOPATH我認為我應該完全避免,但我只是想看看我是否能夠獲取該依賴項。

我絕對建議嘗試使用Go 1.13 beta:

$ go get golang.org/dl/go1.13beta1
$ go1.13beta1 download
$ go1.13beta1 get foo

甚至更好,請嘗試使用最新的Go on tip / master(鑒於Go 1.13 beta1版本在此之前已經存在了一個多月):

$ go get golang.org/dl/gotip
$ gotip download
$ gotip get foo

Go 1.13改進了使用私有存儲庫的幾個方面(包括CL 170879和其他改進),並且與Go 1.12相比,它通常具有更好的錯誤消息。

對於您的第一個錯誤消息:

$ go get -u gitlab.com/my-company/my-team/my-library.git
go: finding gitlab.com/my-company/my-team/my-library.git latest
go: gitlab.com/my-company/my-team/my-library.git@v0.0.0-20190802120216-712a10fb5fac:
 parsing go.mod: unexpected module path "gitlab.com/my-company/my-team/my-library"
go get: error loading module requirements

這是go命令,抱怨模塊的導入/ go.mod方式與其在go.modmodule行中聲明自己的身份之間的不匹配。 如果模塊foo被導入模塊bar ,然后foo需要參考bar ,同樣的方式bar聲明了它的身份module的線bargo.mod文件。

換句話說,用於導入模塊(或go get模塊)的導入路徑需要從在導入模塊go.modmodule行上聲明的確切模塊路徑開始。 您可能需要更改導入程序以匹配go.mod文件中module行上go.mod格式,或者您可能需要更改go.modmodule行以匹配導入程序所使用的格式,但是它們可以不同意。 如果他們不同意,您將得到第一個報告的錯誤。

通常,您可以選擇如何將私有存儲庫與Go模塊一起使用。 這兩篇博客文章概述了幾個問題,並介紹了一些方法,如果您還沒有閱讀它們,那么非常值得一讀:

最后,如果仍然不清楚發生了什么,您可能應該嘗試go get -v foogo get -v -x foo

  • go get -v標志要求打印更多詳細信息,包括HTTPS請求 ,但請注意,根據遠程存儲庫的配置,可能會期望某些“錯誤”(例如404錯誤)。

  • 如果問題的性質仍然不清楚,您也可以嘗試使用更詳細的命令go get -v -x foo ,這也顯示了git或其他VCS命令正在發出。 如果有必要,您通常可以在go工具的上下文之外執行相同的git命令,以進行故障排除。

  1. 如果樓宇服務器無法訪問互聯網,我們需要一個私有的“nexus3 goproxy”。
export GOPROXY=http://nexus.my-company.com/nexus/repository/goproxy/,direct
export GONOPROXY=gitlab.my-company.com
export GOSUMDB=off
export GO111MODULE=on
  1. 禁止嘗試通過 http(s) 協議下載

即使“gitlab.my-company.com”不支持https,也可以這樣配置:

git config --global url."git@gitlab.my-company.com:".insteadOf "https://gitlab.my-company.com/"
  1. 由於gitlab的缺陷,我們需要替換go.mod config中的模塊下載路徑
require (
    gitlab.my-company.com/my-team/my-library v0.0.0-00010101000000-000000000000
)

replace (
    #use "go get -insecure gitlab.my-company.com/my-team/my-library" to get latest commit hash
    gitlab.my-company.com/my-team/my-library => git.midea.com/my-team/my-library.git v0.0.0-XXXXXXXXXXXXXX-YYYYYYYYYYYY
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM