Как использовать gocenter remote Artifactory repo для локального разрешения зависимостей? - PullRequest
0 голосов
/ 17 апреля 2019

Я новичок и пытаюсь использовать gocenter remote 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 env var:

$ 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 ':'

То есть двоеточие между моим протоколом и URL-адресом является недопустимым символом? Кроме того, почему он удаляет один из моих слэшей?

- UPDATE2: Я получил "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, re: 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 работает.

1 Ответ

1 голос
/ 18 апреля 2019

Вы упомянули, что вы не разработчик Go, поэтому позвольте мне рассказать вам обо всех этапах.Я понимаю, что это может быть немного излишним для некоторых разработчиков, но это может вам помочь.

В зависимости от того, куда вы поместили свой исходный код, вам нужно будет установить переменную окружения GO111MODULE.Начиная с версии 1.11, рекомендуется больше не помещать исходный код в $ GOPATH.Если вы поместили свой код туда и хотите использовать модули Go, вам нужно установить GO111MODULE на true (лично я храню весь свой код Go вне $ GOPATH).В Windows вы должны сначала создать переменную окружения и установить ее соответствующим образом (и перезапустить свой терминал).

Чтобы создать модуль Go, вам нужно будет выполнить команду go mod init <name of your module>.В моем случае я выполнил команду 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

он удалит indirect из файла go.mod, потому что теперь у меня есть код, который зависит от моего модуля.

...