Основной мотивацией для модулей 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 должны быть проверены в системе контроля версий.
Читайте также:
- Go модули: введение
- Go FAQ: Как управлять версиями пакетов, используя "go get"?
- Go модули: создание нового модуля
Комментариев нет:
Отправить комментарий