【问题标题】:How to use gocenter remote Artifactory repo for local dependency resolution?如何使用 gocenter 远程 Artifactory repo 进行本地依赖解析?
【发布时间】:2019-08-09 06:42:38
【问题描述】:

我是新手,正在尝试使用 gocenter 远程 repo (Artifactory 6.8) 来解决依赖关系。尽管设置了 GOPROXY env var,但我的 gocenter-cache 存储库仍然为空。

这是我的代码。

package main

import (
        "fmt"
        "github.com/naoina/go-stringutil"
)

func main() {
        var str string = "hello_world_go"
        fmt.Println(stringutil.ToUpperCamelCase(str)) //prints HelloWorldGo
}

我要解决的依赖关系在这里:https://search.gocenter.io/github.com~2Fnaoina~2Fgo-stringutil/versions

这是我的 GOPROXY 环境变量:

$ echo $GOPROXY
https://<<my Artifactory URL>>/api/go/gocenter

这是 gocenter 存储库定义的截断版本。我使用jfrog docs 进行设置:

{
  "key" : "gocenter",
  "packageType" : "go",
  "url" : "https://gocenter.io/",
  "rclass" : "remote"
}

当我运行“go get”时,依赖解决了......

$ go get -v github.com/naoina/go-stringutil
github.com/naoina/go-stringutil (download)

但是 gocenter-cache 是空的,告诉我它没有被使用。

{
  "repo" : "gocenter-cache",
  "path" : "/",
  "created" : "2019-04-17T16:35:37.586Z",
  "lastModified" : "2019-04-17T16:35:37.586Z",
  "lastUpdated" : "2019-04-17T16:35:37.586Z",
  "children" : [ ],
  "uri" : "https://<<REDACTED>>/api/storage/gocenter-cache"
}

也许我的“go get”应该有不同的目标?我只是在使用 gocenter 中存在的内容:https://search.gocenter.io/github.com~2Fnaoina~2Fgo-stringutil/versions

任何帮助指出我做错了什么将不胜感激。我还没有进入模块或类似的东西,因为我是一个工件管理员而不是一个 go 开发人员。我只是在尝试对这个功能进行原型设计,以便我们可以帮助建议我们的用户做什么。

--更新:我找到了https://golang.org/cmd/go/#hdr-Module_proxy_protocol,然后尝试了这个:

$ echo $GOPROXY; go get $GOPROXY/github.com/naoina/go-stringutil
https://<<REDACTED>>/api/go/gocenter
package https:/<<REDACTED>>/api/go/gocenter/github.com/naoina/go-stringutil: https:/<<REDACTED>>/api/go/gocenter/github.com/naoina/go-stringutil: invalid import path: malformed import path "https:/<<REDACTED>>/api/go/gocenter/github.com/naoina/go-stringutil": invalid char ':'

所以我的协议和我的网址之间的冒号是无效字符?另外为什么要删除我的一个正斜杠?

--更新2: 我得到了“go mod init”的工作,有点:

$ go mod init
go: creating new go.mod: module example/hello
$ ls
go.mod  hello.go
$ go build
build example/hello: cannot load github.com/naoina/go-stringutil: cannot find module providing package github.com/naoina/go-stringutil
$ cat go.mod
module example/hello

go 1.12
$ echo $GOPROXY
https://<<REDACTED>>/api/go/gocenter

--更新 3:

$ cat go.mod
module example/hello

go 1.12

require github.com/naoina/go-stringutil v0.1.0

$ go build
hello.go:6:2: cannot find package "github.com/naoina/go-stringutil" in any of:
        C:\Go\src\github.com\naoina\go-stringutil (from $GOROOT)
        C:\Users\samuelm\go\src\github.com\naoina\go-stringutil (from $GOPATH)

$ echo $GOPROXY
https://<<REDACTED>>/api/go/gocenter

--更新 4:看来我还没有使用模块?

$ go list -m all
go list -m: not using modules

--更新 5,回复:retgits 你的步骤有所帮助,但我仍然没有一路走来。

$ find .
.
./bin
./src
./src/example.com
./src/example.com/hello
./src/example.com/hello/hello.go

$ cd src/

$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello

$ cat go.mod
module example.com/hello

go 1.12

$ go get -v github.com/naoina/go-stringutil
Fetching https://<<REDACTED>>/api/go/gocenter/github.com/naoina/go-stringutil/@v/list
Fetching https://<<REDACTED>>/api/go/gocenter/github.com/naoina/@v/list
Fetching https://<<REDACTED>>/api/go/gocenter/github.com/@v/list
go get github.com/naoina/go-stringutil: unexpected status (https://<<REDACTED>>/api/go/gocenter/github.com/naoina/go-stringutil/@v/list): 404 Not Found

$ go build example.com/hello
can't load package: package example.com/hello: unknown import path "example.com/hello": cannot find module providing package example.com/hello

$ cd example.com/hello/

$ go build
build example.com/hello/example.com/hello: cannot load github.com/naoina/go-stringutil: cannot find module providing package github.com/naoina/go-stringutil

我没有在我的 GOPROXY 中提供凭据,因为我们的最终用户没有帐户,我们处于防火墙环境中并允许完全匿名读取访问。如果我们必须提供用户帐户,那么我们将无法支持 Go。

--最终更新: 删除我的本地代理解决了 404 问题,retgits 解决方案有效。

【问题讨论】:

  • 您是否在模块感知的 Go 项目中运行命令?换句话说,您在其中运行命令的文件夹是否有 go.mod 文件?比较我的机器在 Go 项目中使用 Go mod 和空文件夹(不是 Go 项目)运行它的结果,我看到的结果和你一样(这是 Go 客户端的预期行为)
  • 要使用 go mod,您可以执行以下操作:echo "module test" &gt; go.mod; go mod tidy。如果您的代理设置正确,它应该可以工作。
  • 我没有 go.mod 文件。我不知道这是否需要。我会试试的。
  • 我得到:“go: GO111MODULE=auto 在 GOPATH/src 中禁用了模块;请参阅‘go help modules’”。我没有设置环境变量“GO11MODULE”。
  • 查看 update2 以创建我的 go.mod 文件。

标签: go artifactory


【解决方案1】:

您提到您不是 Go 开发人员,所以让我带您完成所有步骤。我意识到这对这里的一些开发人员来说可能有点矫枉过正,但它可能会对你有所帮助。

根据您放置源代码的位置,您需要设置环境变量GO111MODULE。从 go 1.11 开始,建议不要再将源代码放在 $GOPATH 中。如果您将代码放在那里并想使用 Go 模块,则必须将 GO111MODULE 设置为 true(我个人将所有 Go 代码保存在 $GOPATH 之外)。在 Windows 上,您必须先创建环境变量并进行相应设置(然后重新启动终端)。

要创建 Go 模块,您必须运行命令 go mod init &lt;name of your module&gt;。在我的例子中,我运行了命令go mod init github.com/retgits/bla,它创建了一个go.mod 文件

module github.com/retgits/bla

go 1.12

现在添加模块就像运行go get 一样简单。如果您想使用 GoCenter 或 Artifactory 来帮助解析您的模块。

为了帮助解析模块,您可能需要查看两个选项:

  • 使用名为goc 的实用程序
  • 设置远程和虚拟代理

使用 goc

goc 实用程序自动将 GOPROXY 设置为 GoCenter,绕过 Artifactory 等其他代理。 Go 客户端的当前行为是查看一个代理,如果没有从那里解析所有模块,则构建失败。 goc 将首先查看 GoCenter,如果模块不在 GoCenter 中,它将从其原始位置(如 GitHub)获取模块

使用 Artifactory

如果您想使用 Artifactory 来解析和缓存您的 Go 模块,您必须使用 GoCenter 的设置(在您提到的文档中)创建一个远程存储库。您必须将该远程存储库包含到一个虚拟存储库中才能正常工作。

将 GoCenter 设置为 GOPROXY

第三种选择是仅使用 GoCenter(由 JFrog 创建的公共注册表),但这可能会解决您最初的问题:

export GOPROXY="https://gocenter.io"
go get -v github.com/naoina/go-stringutil

无论您选择哪个选项,它都会将go.mod 更新为

module github.com/retgits/bla

go 1.12

require github.com/naoina/go-stringutil v0.1.0 // indirect

indirect 是因为我尚未使用使用此导入的代码创建 .go 文件。

如果我现在用

创建一个main.go 示例
package main

import (
    "fmt"

    "github.com/naoina/go-stringutil"
)

func main() {
    str := stringutil.ToSnakeCase("HelloWorld")
    fmt.Println(str)
}
// Running go run main.go would result in
// hello_world

它将从 go.mod 文件中删除 indirect,因为我现在有依赖于我的模块的代码。

【讨论】:

  • 这有助于并表明我的 GOPROXY 正在被使用,但是我从 Artifactory 得到了 404。请参阅上面的更新 #5。
  • @SamMorehouse,您是使用虚拟存储库还是远程存储库作为您的 GOPROXY?如果您使用的是远程存储库,您还必须设置一个虚拟存储库,其中包含指向 GoCenter 的远程存储库。我有一个名为gocenter 的远程存储库,该存储库是我的虚拟存储库go2 的一部分。这样,我将我的 GOPROXY 设置为 http://&lt;artifactoryserver&gt;/artifactory/api/go/go2
  • 啊!更多未记录的功能 :) 让我想起 helm 是如何工作的,除非您将所有内容都包装在虚拟存储库中。
  • 我将远程仓库更改为“gocenter-remote”,并创建了一个名为“gocenter”的虚拟仓库,其中仅包含远程仓库。当我尝试“去获取”时,这仍然返回“404 Not Found”
  • “goc”二进制文件从gocenter.io下载了依赖项(goc get ...),绕过了我的虚拟/远程仓库。我的 gocenter-remote-cache 存储库是空的。 go.mod 文件已按照您建议 @retgits 的间接评论进行了更新,该评论在我构建后被删除。 “goc build”为我构建了一个 hello.exe
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 2012-11-03
  • 2023-03-16
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多