Golang模块,私有存储库和gopath

时间:2018-11-28 09:39:38

标签: go go-modules

我们正在将内部代码库从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项目本身的目标所在。所以。

  1. golang作者的意图似乎是“无点”路径仅属于标准存储库。域名和项目之间应该有绑定。毫不奇怪,我们不会在内部项目中使用go get。 Here is the source专门:

      

    通常,无点路径是为标准库保留的; (据我所知)go get从未与他们合作,但是go get也是使用版本模块的主要切入点。

    除了我以外,对golang的了解还多的人可以确认吗?

  2. 我的主要假设是,一旦go决定使用模块,所有依赖项必须是模块,并且gopath变得无关紧要,除了作为缓存(对于下载的模块)。这是正确的吗?

  3. 如果为true,则需要在路径上使用私有gitlab(在我们的情况下)存储库。 There's an open issue on handling this that I'm aware of,因此我们可以在必要时实施此操作。我对后果特别是在私有存储库中进行迭代更感兴趣。以前,我们可以在提交任何更改之前在本地开发这些库。现在看来我们可以选择:

    1. 接受此远程依赖关系并进行迭代。我希望避免像这样进行远程推拉。如果确实有必要,有一些解决方法需要互联网连接。
    2. 将所有内容合并到一个大的git存储库中。

如果有关系,我正在使用go version go1.11.2 linux/amd64,而我的同事正在使用darwin/amd64。如果有帮助,我的golang完全与Fedora的存储库安装的一样。

所以tl;dr,我的问题是:go模块是全有还是全无,因为任何依赖都必须使用模块系统来解决(看起来是get),并且gopath变得多余了?还是有关我的设置的某些信息可能会触发此操作失败?是否有某种方法指示应从gopath中显式解决依赖关系?

自提出问题后进行更新

  1. 我可以将myprogram移出gopath。发生相同的问题(mylib已留在gopath中)。
  2. 我可以在mylib目录中运行go mod init mycompany/mylib,也可以不运行;完全没有区别。
  3. 我遇到了Russ Cox's blog post on vgo$GOPROXY解决了我对脱机开发的担忧,并试图解决不了。

3 个答案:

答案 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使用了一种解决方法来解决这个问题。

  1. https://github.com/settings/tokens处生成GITHUB_TOKEN
  2. export GITHUB_TOKEN=xxx
  3. 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"

我希望这会有所帮助。