Система модулей требуется, главным образом, для поддержания версионности ваших модулей в сетевых репозиториях, но это предназначение шире наших целей рассмотрения, и потребует документации. Но если наши пакеты, даже локально отрабатываемые, потребуют использования (библиотечных) кодов из сетевых репозиториев, то тут мы не сможем обойтись без поддержки модулей (мы просто станем получать непреодолимые ошибки компиляции).
Поэтому порепетируем на пакетах, которые мы станем отрабатывать в соседней здесь теме относительно дженериков:
Go: дженерики.
Попробуем скомпилировать:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go build max.go
max.go:4:8: no required module provides package golang.org/x/exp/constraints: go.mod file not found in current directory or any parent directory; see 'go help modules'
Этот номер прошёл бы с компилятором версии
до 1.11, до введения модулей Go.
Это потому, что этот код хочет импортировать пакет из сетевого репозитория constraints:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ grep import max.go
import "fmt"
import "golang.org/x/exp/constraints"
Но теперь импорт возможен только между согласованными версиями (компилятора и пакетов)!
У нас компилятор (и вся соответствующая инфраструктура GoLang):
Код: Выделить всё
olej@R420:~$ go version
go version go1.20rc2 linux/amd64
Теперь для импорта из сетевого репозитория я должен создать файл описания модуля ... Выполним (с
произвольным именем модуля generic — пусть он у нас просто
совпадает с именем каталога):
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go mod init generic
go: creating new go.mod: module generic
go: to add module requirements and sums:
go mod tidy
После чего у нас появится новый файл, пока только такого содержания:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ cat go.mod
module generic
go 1.20
Пока он определяет только версию компилирующей системы, для которой предназначен пакет. И если пакет (или ни один пакет в этом каталоге) не требует пакетов из сетевых репозиториев, то условия (безошибочность) компиляции не изменятся.
И снова пробуем компиляцию:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go build max.go
max.go:4:8: no required module provides package golang.org/x/exp/constraints; to add it:
go get golang.org/x/exp/constraints
Т.е. подсказка (ошибки) говорит как сделать загрузкуимпорта:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go get golang.org/x/exp/constraints
go: downloading golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
go: added golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Но
проще и лучше (и я думаю что
правильнее … и тем более разобраться что же происходит) сразу после инициализации файла go.mod (как это показано выше командой: go mod init ...) выполнить рекомендуемое там же действие вот такой командой:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go mod tidy
go: finding module for package golang.org/x/exp/constraints
go: found golang.org/x/exp/constraints in golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Эта команда
проанализировала списки импорта текущего пакета, и подготовила (загрузила) все требуемые зависимости в нужной (адекватной пакету!) версии. В итоге чего:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ ls -l go.*
-rw-rw-r-- 1 olej olej 85 мар 11 15:34 go.mod
-rw-rw-r-- 1 olej olej 207 мар 11 15:34 go.sum
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ cat go.mod
module generic
go 1.20
require golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Содержимое go.mod (как мы видим) изменилось, добавилось.
Но это не всё! Произошла загрузка требуемых пакетов для импорта, которые мы находим здесь ... выполнив
из любого каталога файловой системы:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs$ go env GOPATH
/home/olej/go
Код: Выделить всё
olej@R420:~/2023/own.BOOKs$ ls `go env GOPATH`/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0 -w80
apidiff CONTRIBUTING.md go.mod LICENSE rand slog
cmd devtools go.sum maps README.md utf8string
codereview.cfg ebnf inotify mmap shootout
constraints ebnflint io PATENTS slices
Код: Выделить всё
olej@R420:~/2023/own.BOOKs$ tree `go env GOPATH`/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0/constraints
/home/olej/go/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0/constraints
├── constraints.go
└── constraints_test.go
0 directories, 2 files
И вот (только) теперь пакет, требующий импорта из сети, замечательно компилируется:
Код: Выделить всё
$ go build max.go
$ ls -l max
-rwxrwxr-x 1 olej olej 1839159 мар 11 16:17 max