Добавим новую функцию в наш пакет, созданный в предыдущих постах: func Proverb возвращает пословицу о конкурентности в Go, вызвав quote.Concurrency, который предоставляется модулем rsc.io/quote/v3. Сначала мы обновляем hello.go, чтобы добавить новую функцию:
package hello
import (
"rsc.io/quote"
quoteV3 "rsc.io/quote/v3"
)
func Hello() string {
return quote.Hello()
}
func Proverb() string {
return quoteV3.Concurrency()
}
Затем мы добавляем тест в hello_test.go:
func TestProverb(t *testing.T) {
want := "Concurrency is not parallelism."
if got := Proverb(); got != want {
t.Errorf("Proverb() = %q, want %q", got, want)
}
}
Тогда мы можем протестировать наш код:
$ go test
go: finding rsc.io/quote/v3 v3.1.0
go: downloading rsc.io/quote/v3 v3.1.0
go: extracting rsc.io/quote/v3 v3.1.0
PASS
ok example.com/hello 0.024s
$
Обратите внимание, что наш модуль теперь зависит как от rsc.io/quote, так и от rsc.io/quote/v3:
$ go list -m rsc.io/q...
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
$
Каждая отдельная основная версия (v1, v2 и т. Д.) модуля Go использует свой путь к модулю: начиная с версии v2, путь должен заканчиваться основной версией. В этом примере v3 из rsc.io/quote больше не является rsc.io/quote: вместо этого он идентифицируется путем к модулю rsc.io/quote/v3. Это соглашение называется семантическим контролем версий импорта, и оно дает несовместимым пакетам (пакетам с разными основными версиями) разные имена. Напротив, v1.6.0 из rsc.io/quote должен быть обратно совместим с v1.5.2, поэтому он повторно использует имя rsc.io/quote. (В предыдущем посте rsc.io/sampler v1.99.99 должен был быть обратно совместим с rsc.io/sampler v1.3.0, но могут возникать ошибки или неверные предположения клиента о поведении модуля.)
Команда go позволяет сборке включать не более одной версии любого конкретного пути модуля, то есть не более одной версии каждой основной версии: одну rsc.io/quote, одну rsc.io/quote/v2, одну rsc.io/quote/v3 и тд. Это дает авторам модулей четкое правило о возможном дублировании пути к одному модулю: невозможно собрать программу как с rsc.io/quote v1.5.2, так и с rsc.io/quote v1.6.0. В то же время, разрешение разных основных версий модуля (поскольку они имеют разные пути) дает потребителям модуля возможность постепенного обновления до новой основной версии. В этом примере мы хотели использовать quote.Concurrency из rsc/quote/v3 v3.1.0, но пока не готовы перенести использование rsc.io/quote v1.5.2. Возможность постепенной миграции особенно важна в большой программе или кодовой базе.
Читайте также:
- Go модули: создание нового модуля
- Go модули: добавление зависимости
- Go модули: обновление зависимостей
Комментариев нет:
Отправить комментарий