我们正在将内部代码库从dep
依赖关系管理器转换为go模块(vgo
或内置于go1.11.2中)。假设我们有这样的代码:
$ GOPATH / src / mycompany / myprogram / main.go:
package main
import (
"fmt"
lib "mycompany/mylib" )
func main() {
fmt.Println("2+3=", lib.add(2, 3))
}
$ GOPATH / src / mycompany / myprogram / go.mod:
module mycompany/myprogram
(它没有任何依赖关系;我们的实际代码中有)。
$ GOPATH / src / mycompany / mylib / lib.go:
package mylib
func Add(x int, y int) int {
return x + y
}
我没有对该代码进行模块化;不管我是否做都不重要。
这些是简单的示例,但是我们的内部代码遵循与历史上类似的结构。
由于这些目录位于Gopath上,因此export GO111MODULE=auto
仍会像以前那样构建并且可以正常工作(未使用模块,因为我们位于gopath上)。但是,当我设置export GO111MODULE=on
时,我立即收到错误消息:
build mycompany/myprogram: cannot find module for path mycompany/mylib
所以我做了一些研究,我想证实我的理解。首先,我说我们的旧方法行得通,但是我对更改使用go模块更感兴趣,因为它似乎是go项目本身的目标所在。所以。
golang作者的意图似乎是“无点”路径仅属于标准存储库。域名和项目之间应该有绑定。毫不奇怪,我们不会在内部项目中使用go get。 Here is the source专门:
通常,无点路径是为标准库保留的; (据我所知)go get从未与他们合作,但是go get也是使用版本模块的主要切入点。
除了我以外,对golang的了解还多的人可以确认吗?
我的主要假设是,一旦go决定使用模块,所有依赖项必须是模块,并且gopath变得无关紧要,除了作为缓存(对于下载的模块)。这是正确的吗?
如果为true,则需要在路径上使用私有gitlab(在我们的情况下)存储库。 There's an open issue on handling this that I'm aware of,因此我们可以在必要时实施此操作。我对后果特别是在私有存储库中进行迭代更感兴趣。以前,我们可以在提交任何更改之前在本地开发这些库。现在看来我们可以选择:
如果有关系,我正在使用go version go1.11.2 linux/amd64
,而我的同事正在使用darwin/amd64
。如果有帮助,我的golang完全与Fedora的存储库安装的一样。
所以tl;dr
,我的问题是:go模块是全有还是全无,因为任何依赖都必须使用模块系统来解决(看起来是get),并且gopath变得多余了?还是有关我的设置的某些信息可能会触发此操作失败?是否有某种方法指示应从gopath中显式解决依赖关系?
自提出问题后进行更新:
myprogram
移出gopath。发生相同的问题(mylib
已留在gopath中)。go mod init mycompany/mylib
,也可以不运行;完全没有区别。$GOPROXY
解决了我对脱机开发的担忧,并试图解决不了。答案 0 :(得分:7)
我使用ls-remote git命令来帮助解决私有仓库标签并得到它。
$ go env GO111MODULE=on
$ go env GOPRIVATE=yourprivaterepo.com
$ git ls-remote -q https://yourprivaterepo.com/yourproject.git
$ go get
答案 1 :(得分:4)
我对GITHUB_TOKEN
使用了一种解决方法来解决这个问题。
GITHUB_TOKEN
export GITHUB_TOKEN=xxx
git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/mycompany".insteadOf "https://github.com/mycompany"
答案 2 :(得分:1)
我在Go Modules with Private Git Repositories媒介上为此编写了一个解决方案。
我们处理它的方式与Alex Pliutau中的答案基本相同,并且该博客通过示例来详细说明如何使用GitHub / GitLab / BitBucket中的令牌设置git config。
GitLab的相关位:
git config --global \
url."https://oauth2:${personal_access_token}@privategitlab.com".insteadOf \
"https://privategitlab.com"
#or
git config --global \
url."https://${user}:${personal_access_token}@privategitlab.com".insteadOf \
"https://privategitlab.com"
我希望这会有所帮助。