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

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

Основной мотивацией для модулей Go было улучшение опыта использования (то есть добавления зависимости) кода, написанного другими разработчиками.

Обновим файл hello.go, который мы создали в предыдущем посте, для импорта rsc.io/quote и используем его для реализации Hello:

package hello

import "rsc.io/quote"

func Hello() string {
    return quote.Hello()
}

Теперь запустим тест, который мы создали в предыдущем посте:

$ go test
go: finding rsc.io/quote v1.5.2
go: downloading rsc.io/quote v1.5.2
go: extracting rsc.io/quote v1.5.2
go: finding rsc.io/sampler v1.3.0
go: finding golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: downloading rsc.io/sampler v1.3.0
go: extracting rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: extracting golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
PASS
ok      example.com/hello    0.023s
$

Команда go разрешает импорт с использованием определенных версий модуля зависимостей, перечисленных в go.mod. Когда он обнаруживает импорт пакета, не предоставленного ни одним модулем в go.mod, команда go автоматически ищет модуль, содержащий этот пакет, и добавляет его в go.mod, используя последнюю версию. ("Последняя" определяется как последняя помеченная как stable (не prerelease) версия, либо последняя помеченная как prerelease версия, либо последняя версия без тегов.) В нашем примере go test разрешил новый импорт rsc.io/quote в модуль rsc.io/quote v1.5.2. Он также загрузил две зависимости, используемые rsc.io/quote, а именно rsc.io/sampler и golang.org/x/text. В файле go.mod записываются только прямые зависимости:

$ cat go.mod
module example.com/hello

go 1.12

require rsc.io/quote v1.5.2
$

Вторая команда go test не будет повторять эту работу, поскольку go.mod обновлен и загруженные модули кэшируются локально (в $GOPATH/pkg/mod):

$ go test
PASS
ok      example.com/hello    0.020s
$

Обратите внимание, что хотя команда go делает добавление новой зависимости быстро и просто, она не обходится без затрат. Ваш модуль теперь буквально зависит от новой зависимости в критических областях, таких как корректность, безопасность и правильное лицензирование, и это лишь некоторые из них.

Как мы видели выше, добавление одной прямой зависимости часто приводит и к другим косвенным зависимостям. Команда go list -m all перечисляет текущий модуль и все его зависимости:

$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0
$

В выводе списка переходов текущий модуль, также известный как основной (main) модуль, всегда является первой строкой, за которой следуют зависимости, отсортированные по пути модуля.

Golang.org/x/text version v0.0.0-20170915032832-14c0d48ead0c является примером псевдо-версии, которая является синтаксисом версии команды go для определенного коммита без тегов.

В дополнение к go.mod команда go поддерживает файл с именем go.sum, содержащий ожидаемые криптографические хеши содержимого определенных версий модуля:

$ cat go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZO...
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:Nq...
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3...
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPX...
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/Q...
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9...
$

Команда go использует файл go.sum, чтобы гарантировать, что будущие загрузки этих модулей получат те же биты, что и первая загрузка, чтобы гарантировать, что модули, от которых зависит ваш проект, не изменятся неожиданно, будь то по злонамеренным, случайным или другим причинам. Оба go.mod и go.sum должны быть проверены в системе контроля версий.


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


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

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