Как выпустить обновленные пакеты для пользователей Go Mod / pkg.go.dev?

Как пометить свое репо и заставить его отображаться для go mod и / или pkg.go.dev?

Я преобразовал один из своих пакетов в go mod. Однако кажется, что сам инструмент go mod может видеть только очень старые версии моего пакета.

РЕДАКТИРОВАТЬ: Я только что заметил, что мои старые версии имели префикс v, тогда как мои новые теги не имели префикса v.

Это основная проблема? Где задокументировано это жесткое требование?


Мой рассматриваемый пакет: https://github.com/eduncan911/podcast

И мои выпуски с тегами: https://github.com/eduncan911/podcast/releases

1.4.1
1.4.0
1.3.2
1.3.1
1.3.0 <- this is the current version Go Modules sees available

Однако pkg.go.dev показывает:

v1 – github.com/eduncan911/podcast
v1.3.0 – Feb 19, 2017
v1.1.0 – Feb 6, 2017
v1.0.0 – Feb 5, 2017

В ответах на часто задаваемые вопросы на https://proxy.golang.org/ говорится:

Я зафиксировал новое изменение (или выпустил новую версию) в репозиторий, почему оно не отображается, когда я запускаю go get -u или go list -m --versions?

Чтобы улучшить кэширование и задержку обслуживания наших сервисов, новые версии могут появляться не сразу. Если вы хотите, чтобы новый код был немедленно доступен в зеркале, сначала убедитесь, что в базовом репозитории исходного кода есть тег с семантической версией для этой ревизии. Затем явно запросите эту версию с помощью go get module @ version. По истечении одной минуты кеширования, команда go увидит версию с тегами.

Итак, я попробовал это:

$ go get github.com/eduncan911/[email protected]
go: cannot use path@version syntax in GOPATH mode

Догадка означает, что мне нужно участвовать в проекте репо или Go; Итак, я создал один:

$ cat main.go
package main

import (
        "fmt"
        "github.com/eduncan911/podcast"
)

func main() {
        fmt.Print(podcast.MP3)
}

Перешел в этот каталог, запустил go mod init и снова запустил:

$ go mod download github.com/eduncan911/[email protected]
go: finding github.com/eduncan911/podcast 1.3.1
$ go mod download github.com/eduncan911/[email protected]
go: finding github.com/eduncan911/podcast 1.3.2
$ go mod download github.com/eduncan911/[email protected]
go: finding github.com/eduncan911/podcast 1.4.0
$ go mod download github.com/eduncan911/[email protected]
go: finding github.com/eduncan911/podcast 1.4.1

Хорошо, без ответа и вернуться к подсказке. Может, я что-то понимаю ...

$ go run main.go
go: finding github.com/eduncan911/podcast v1.3.0
go: downloading github.com/eduncan911/podcast v1.3.0
go: extracting github.com/eduncan911/podcast v1.3.0

Дох.

$ go mod graph
github.com/eduncan911/podcast-test github.com/eduncan911/[email protected]
github.com/eduncan911/podcast-test github.com/pkg/[email protected]

Возможно, мне нужно загрузить явные версии, например, в FAQ сказано module @ version.

Отредактировал go.mod и указал 1.3.1. Потом:

$ go mod download
go: github.com/eduncan911/[email protected]: reading github.com/eduncan911/podcast/go.mod at revision v1.3.1: unknown revision v1.3.1

Моей последней попыткой было вернуться к оператору FAQ и запустить go get module@version, как сказано:

$ go get github.com/eduncan911/[email protected]
go: github.com/eduncan911/[email protected]: reading github.com/eduncan911/podcast/go.mod at revision v1.4.1: unknown revision v1.4.1

Обратите внимание: я продолжал менять версии между некоторыми из приведенных выше утверждений. Но каждый раз это была версия, которой не было.

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

Заранее спасибо!


person eduncan911    schedule 13.02.2020    source источник


Ответы (2)


Есть две проблемы с OP.

  1. Go Mod игнорирует теги пакетов без префикса v, как указал @Flimzy
  2. pkg.go.dev не показывать / не раскрывать новые версии, как только они помечены, полагаясь на то, что "сообщество" запросит более новую версию до того, как она будет найдена

Первое - простое решение - пометьте все префиксом v.

Второй можно исправить, добавив это в конвейер CICD:

curl https://sum.golang.org/lookup/github.com/eduncan911/[email protected]

Это самый надежный способ принудительно обновить pkg.go.dev и немедленно сделать новый тег доступным для остальных ваших конвейеров для запуска и тестирования. Он работает, заставляя pkg.go.dev получить хэш для этой конкретной версии. Если версии не существует, она получит ее, а затем хэширует. Следовательно, добавление к источнику данных Go Mod.

Я должен предупредить, что это не очень хорошо документировано, поэтому API может измениться со временем. Они хотят, чтобы вы использовали команду «Прокси»; но у меня не было особой надежности в течение многих тестовых публикаций. Однако приведенная выше команда curl всегда работала на 100% и была доступна немедленно (сброс кеширования).

person eduncan911    schedule 23.05.2020

Это основная проблема? Где задокументировано это жесткое требование?

Да, это обязательно. Из Go wiki (курсив добавлен):

Модули должны иметь семантическую версию в соответствии с semver, обычно в форме v (major). (Minor). (Patch), например v0.1.0, v1.2.3 или v1.5.0-rc.1. Начальный v является обязательным. При использовании Git выпущенный тег фиксирует свои версии. Становятся доступными публичные и частные репозитории модулей и прокси (см. FAQ ниже).

person Flimzy    schedule 13.02.2020
comment
Спасибо. Однако, как только я это сделал, они все еще не появлялись и требовали ручного go mod download после редактирования образца go.mod. Есть ли другой способ заставить его отображать новые версии без необходимости добавлять поддельный проект и команду go mod download в мои конвейеры CICD после создания тега? Кажется, это перебор. - person eduncan911; 14.02.2020
comment
@ eduncan911 документы, которые вы сами цитировали в вопросе, содержат статусы. Чтобы улучшить кэширование и задержку обслуживания наших сервисов, новые версии могут появляться не сразу. Это не значит, что они никогда не появятся. То, что вы описали, заставляет его немедленно обновляться из репо, а не всякий раз, когда может запускаться его обычное обновление кеша. - person Adrian; 14.02.2020