вторник, 25 июня 2019 г.

Go модули: добавление зависимости от новой основной версии

Добавим новую функцию в наш пакет, созданный в предыдущих постах: 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. Возможность постепенной миграции особенно важна в большой программе или кодовой базе.


Читайте также:


Комментариев нет:

Отправить комментарий