我将一些私有的Go项目移到了GitLab,同时摆脱了Godeps
,带有dep
目录的vendor
和所有这些,因为我只想使用Go模块。
我正在使用Go版本:go1.12.6 linux/amd64
。
gitlab.com/my-company/my-team/my-library
有一个私人的“库”项目/ git存储库。可以和go.mod
和go.sum
一起用作Go模块。my-library
用作另一个项目的依赖项,即gitlab.com/my-company/my-team/my-project
。URL的结构相同,唯一改变的是存储库的名称。
在my-library
中导入my-project
时遇到各种错误。
我知道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
时,我发现输出为空,即没有冲突的依赖关系。.git
结尾,并且(出于某些我不理解的原因)URL被切为my-team
级别。 / li>
GO111MODULE=off
似乎迫使go get
签入$GOPATH
,我认为我应该完全避免,但是我只是想看看我是否能够以此方式获取依赖项。答案 0 :(得分:2)
我绝对建议尝试使用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
命令,抱怨模块的导入/请求方式与其在其module
的{{1}}行中声明自己的身份之间的不匹配。如果模块go.mod
正在导入模块foo
,则bar
需要引用foo
,就像bar
在{{1}上声明其身份一样bar
的{{1}}文件的}行。
以另一种方式表示,用于导入模块(或module
模块)的导入路径需要以在导入模块bar
的{{1}}行上声明的确切模块路径开头}。您可能需要更改导入程序以匹配go.mod
文件中go get
行中声明的格式,或者您可能需要将module
中的go.mod
行更改为与进口商使用的表单相匹配,但不能不同意。如果他们不同意,您将报告第一个错误。
通常,您可以选择如何将私有存储库与Go模块一起使用。这两篇博客文章概述了几个问题,并介绍了一些方法,如果您还没有阅读它们,那么非常值得一读:
最后,如果仍然不清楚发生了什么,您可能应该尝试module
或go.mod
:
module
的{{1}}标志要求打印更多详细信息,包括HTTPS requests,但请注意,某些“错误”(例如404错误)可能会基于有关如何配置远程存储库的信息。
如果问题的本质仍然不清楚,您还可以尝试更详细的go.mod
,它也显示了正在发出的git或其他VCS命令。如果需要,通常可以在go get -v foo
工具的上下文之外执行相同的git命令,以进行故障排除。
答案 1 :(得分:1)
export GOPROXY=http://nexus.my-company.com/nexus/repository/goproxy/,direct
export GONOPROXY=gitlab.my-company.com
export GOSUMDB=off
export GO111MODULE=on
即使“ gitlab.my-company.com”不支持https,也可以这样配置:
git config --global url."git@gitlab.my-company.com:".insteadOf "https://gitlab.my-company.com/"
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
)