Go模块,私有仓库和gopath

dia*_*rov 9 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)) 
}
Run Code Online (Sandbox Code Playgroud)

$ GOPATH / src / mycompany / myprogram / go.mod:

module mycompany/myprogram
Run Code Online (Sandbox Code Playgroud)

(它没有任何依赖关系;我们的实际代码中有)。

$ GOPATH / src / mycompany / mylib / lib.go:

package mylib

func Add(x int, y int) int {
        return x + y
}
Run Code Online (Sandbox Code Playgroud)

我没有将此代码模块化。不管我是否做都不重要。

这些是简单的示例,但是我们的内部代码遵循与历史上类似的结构。

由于这些目录位于Gopath上,因此export GO111MODULE=auto仍可以像以前一样进行构建,并且可以正常工作(未使用模块,因为我们位于gopath上)。但是,设置后,export GO111MODULE=on我立即收到错误消息:

build mycompany/myprogram: cannot find module for path mycompany/mylib
Run Code Online (Sandbox Code Playgroud)

因此,我做了一些研究,我想证实我的理解。首先,让我说我们的旧方法可行,但是我对更改使用go模块更感兴趣,因为它似乎是go项目本身的目标所在。所以。

  1. Golang作者的意图似乎是“无点”路径仅属于标准存储库;域名和项目之间应该有绑定。毫不奇怪,我们不会在内部项目中使用go get。这里是具体的来源

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

    谁能比我更了解golang的人可以证实这一点?

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

  3. 如果是这样,我们需要在路径上使用私有gitlab(在我们的情况下)存储库。我知道在处理此问题方面存在一个开放的问题,因此我们可以在必要时实施此问题。我对后果特别是在私有存储库中进行迭代更感兴趣。以前,我们可以在提交任何更改之前在本地开发这些库。现在看来,我们可以选择:

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

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

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

自问问题以来的更新

  1. 我可以myprogram走出小路。发生相同的问题(mylib已留在gopath中)。
  2. 我可以go mod init mycompany/mylib在mylib目录中运行或不运行;它根本没有区别。
  3. 我遇到了Russ Cox在vgo上的博客文章。我对线下开发的担忧(我尝试不深入探讨)已通过解决$GOPROXY

Ale*_*tau 11

我使用一种解决方法GITHUB_TOKEN来解决此问题。

  1. GITHUB_TOKEN在这里生成https://github.com/settings/tokens
  2. export GITHUB_TOKEN=xxx
  3. git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/mycompany".insteadOf "https://github.com/mycompany"

  • 谢谢。我们使用 gitlab,但也存在类似的解决方法,我们肯定会使用它。 (3认同)

utk*_*mez 10

我使用 ls-remote git 命令来帮助解析私有 repo 标签并继续追踪它。

$ go env GO111MODULE=on
$ go env GOPRIVATE=yourprivaterepo.com
$ git ls-remote -q https://yourprivaterepo.com/yourproject.git
$ go get
Run Code Online (Sandbox Code Playgroud)

  • 您也可以对私有 Github 存储库使用 `go env -w GOPRIVATE`:`go env -w GOPRIVATE=github.com/username/*` (3认同)

小智 5

我在Medium:带有私有Git信息库的Go模块上写了一个解决方案。

我们处理它的方式与上述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"
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。