Go: модули
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
В экосистеме GoLang создано и нарабатывается множество сторонних пакетов, пригодных для свободного и всестороннего использования. Они, главным образом, располагаются в сетевых репозиториях, о которых упоминалось выше. Но с некоторых пор (из-за такого обилия во многом), для поддержания всего этого хозяйстве потребовалась система поддержания версионности.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
Поэтому порепетируем на пакетах, которые мы станем отрабатывать в соседней здесь теме относительно дженериков: 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'
Это потому, что этот код хочет импортировать пакет из сетевого репозитория 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
Код: Выделить всё
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
Код: Выделить всё
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
Но это не всё! Произошла загрузка требуемых пакетов для импорта, которые мы находим здесь ... выполнив из любого каталога файловой системы:
Код: Выделить всё
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
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
То что достаточно любопытно знать относительно модулей Go:
Введение в систему модулей Go
Введение в модули27 авг 2018
03.12.2021
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
1). потому что это теперь нужно будет почти в люьом проекте...
2). потому что это очень просто, если знать как...
Добавляю в код своего проекта:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ head -n6 errgrp.go
package main
import (
"os"
"fmt"
"golang.org/x/sync/errgroup"
)
И при сборке получу ошибку!
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go build errgrp.go
errgrp.go:5:2: no required module provides package golang.org/x/sync/errgroup; to add it:
go get golang.org/x/sync/errgroup
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod init errgrp
go: creating new go.mod: module errgrp
go: to add module requirements and sums:
go mod tidy
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -oh | grep ^-rw
-rw-rw-r-- 1 olej 1,3K фев 7 14:25 errgrp.go
-rw-rw-r-- 1 olej 2,0K фев 7 14:40 errgrp.hist
-rw-rw-r-- 1 olej 25 фев 7 14:42 go.mod
-rw-r--r-- 1 olej 276 фев 7 14:33 Makefile
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
Теперь к ошибке сетевого импорта...
Тут можно поступить 2-мя способами:
1). конкретно указать (что откуда импортируется):
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go get golang.org/x/sync/errgroup
go: downloading golang.org/x/sync v0.6.0
go: added golang.org/x/sync v0.6.0
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
require golang.org/x/sync v0.6.0 // indirect
2). И это лучше Поручить самому GoLang разобраться что и откуда нужно импортировать:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
После этого (небольшие отличия):
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
require golang.org/x/sync v0.6.0
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -oh | grep ^-rw
-rw-rw-r-- 1 olej 1,4K фев 7 14:57 errgrp.go
-rw-rw-r-- 1 olej 5,1K фев 7 14:56 errgrp.hist
-rw-rw-r-- 1 olej 59 фев 7 14:55 go.mod
-rw-rw-r-- 1 olej 153 фев 7 14:48 go.sum
-rw-r--r-- 1 olej 276 фев 7 14:33 Makefile
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.sum
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go env GOPATH
/home/olej/go
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -o `go env GOPATH`/pkg/mod/golang.org/x/ | grep sync
dr-xr-xr-x 6 olej 4096 июн 1 2023 sync@v0.0.0-20210220032951-036812b2e83c
dr-xr-xr-x 6 olej 4096 фев 7 14:48 sync@v0.6.0
Так работает управление версиями.
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ tree `go env GOPATH`/pkg/mod/golang.org/x/sync@v0.6.0
/home/olej/go/pkg/mod/golang.org/x/sync@v0.6.0
├── codereview.cfg
├── CONTRIBUTING.md
├── errgroup
│ ├── errgroup_example_md5all_test.go
│ ├── errgroup.go
│ ├── errgroup_test.go
│ ├── go120.go
│ ├── go120_test.go
│ └── pre_go120.go
├── go.mod
├── LICENSE
├── PATENTS
├── README.md
├── semaphore
│ ├── semaphore_bench_test.go
│ ├── semaphore_example_test.go
│ ├── semaphore.go
│ └── semaphore_test.go
├── singleflight
│ ├── singleflight.go
│ └── singleflight_test.go
└── syncmap
├── map_bench_test.go
├── map.go
├── map_reference_test.go
└── map_test.go
4 directories, 22 files
Код: Выделить всё
olej@R420:~/go/pkg/mod/golang.org/x$ pwd
/home/olej/go/pkg/mod/golang.org/x
olej@R420:~/go/pkg/mod/golang.org/x$ ls -o
итого 140
dr-xr-xr-x 33 olej 4096 мая 31 2023 crypto@v0.0.0-20191011191535-87dc89f01550
dr-xr-xr-x 34 olej 4096 июн 1 2023 crypto@v0.0.0-20210513164829-c07d793c2f9a
dr-xr-xr-x 34 olej 4096 апр 16 2023 crypto@v0.0.0-20221012134737-56aed061732a
dr-xr-xr-x 34 olej 4096 апр 16 2023 crypto@v0.1.0
dr-xr-xr-x 34 olej 4096 июн 29 2023 crypto@v0.8.0
dr-xr-xr-x 15 olej 4096 июн 1 2023 exp@v0.0.0-20200224162631-6cc2880d07d6
dr-xr-xr-x 18 olej 4096 мая 10 2022 exp@v0.0.0-20220428152302-39d4317da171
dr-xr-xr-x 17 olej 4096 июн 29 2023 exp@v0.0.0-20221205204356-47842c84f3db
dr-xr-xr-x 17 olej 4096 апр 16 2023 exp@v0.0.0-20221217163422-3c43f8badb15
dr-xr-xr-x 17 olej 4096 мар 11 2023 exp@v0.0.0-20230310171629-522b1b587ee0
dr-xr-xr-x 17 olej 4096 июн 1 2023 image@v0.0.0-20190802002840-cff245a6509b
dr-xr-xr-x 5 olej 4096 июн 1 2023 lint@v0.0.0-20210508222113-6edffad5e616
dr-xr-xr-x 14 olej 4096 июн 1 2023 mobile@v0.0.0-20190719004257-d2bd2a29d028
dr-xr-xr-x 9 olej 4096 июн 1 2023 mod@v0.4.2
dr-xr-xr-x 24 olej 4096 мая 31 2023 net@v0.0.0-20190923162816-aa69164e4478
dr-xr-xr-x 24 olej 4096 июн 1 2023 net@v0.0.0-20210614182718-04defd469f4e
dr-xr-xr-x 24 olej 4096 апр 16 2023 net@v0.0.0-20221014081412-f15817d10f9b
dr-xr-xr-x 24 olej 4096 апр 16 2023 net@v0.7.0
dr-xr-xr-x 24 olej 4096 июн 29 2023 net@v0.9.0
dr-xr-xr-x 38 olej 4096 июн 1 2023 oauth2@v0.0.0-20210819190943-2bc19b11175f
dr-xr-xr-x 6 olej 4096 июн 1 2023 sync@v0.0.0-20210220032951-036812b2e83c
dr-xr-xr-x 6 olej 4096 фев 7 14:48 sync@v0.6.0
dr-xr-xr-x 6 olej 4096 мая 31 2023 sys@v0.0.0-20190924154521-2837fb4f24fe
dr-xr-xr-x 8 olej 4096 июн 1 2023 sys@v0.0.0-20210917161153-d61c044b1678
dr-xr-xr-x 8 olej 4096 апр 16 2023 sys@v0.0.0-20221013171732-95e765b1cc43
dr-xr-xr-x 8 olej 4096 апр 16 2023 sys@v0.5.0
dr-xr-xr-x 8 olej 4096 июн 29 2023 sys@v0.7.0
dr-xr-xr-x 2 olej 4096 июн 1 2023 term@v0.0.0-20210220032956-6a3ed077a48d
dr-xr-xr-x 19 olej 4096 июн 1 2023 text@v0.3.6
dr-xr-xr-x 19 olej 4096 апр 16 2023 text@v0.3.8
dr-xr-xr-x 19 olej 4096 апр 16 2023 text@v0.7.0
dr-xr-xr-x 19 olej 4096 июн 29 2023 text@v0.9.0
dr-xr-xr-x 3 olej 4096 июн 1 2023 time@v0.0.0-20210723032227-1f47c861a9ac
dr-xr-xr-x 16 olej 4096 июн 1 2023 tools@v0.1.5
dr-xr-xr-x 3 olej 4096 июн 1 2023 xerrors@v0.0.0-20200804184101-5ec99f83aff1
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
Но это ещё не всё...
Собрался импортировать и дописал в *.go код:
Код: Выделить всё
import "github.com/hajimehoshi/ebiten"
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
go: finding module for package github.com/hajimehoshi/ebiten
go: downloading github.com/hajimehoshi/ebiten v1.12.12
go: found github.com/hajimehoshi/ebiten in github.com/hajimehoshi/ebiten v1.12.12
go: downloading golang.org/x/sys v0.0.0-20200918174421-af09f7315aff
go: downloading github.com/gofrs/flock v0.8.0
go: downloading golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f
go: downloading github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2
go: downloading golang.org/x/image v0.0.0-20200801110659-972c09e46d76
go: downloading golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
require (
github.com/hajimehoshi/ebiten v1.12.12
golang.org/x/sync v0.6.0
)
require (
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2 // indirect
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 // indirect
golang.org/x/image v0.0.0-20200801110659-972c09e46d76 // indirect
golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect
)
А я уже наимпортировал того что не надо
Делаем:
Сначала я просто убираю строку ненужного мне импорта (проверить что будет):
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
require golang.org/x/sync v0.6.0
Он перетёр ненужный импорт
Вписываю новый импорт в *.go:
Код: Выделить всё
import "github.com/eiannone/keyboard"
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go build contextc.go
contextc.go:9:5: no required module provides package github.com/eiannone/keyboard; to add it:
go get github.com/eiannone/keyboard
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
go: finding module for package github.com/eiannone/keyboard
go: downloading github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
go: found github.com/eiannone/keyboard in github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp
go 1.21.3
require (
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
golang.org/x/sync v0.6.0
)
require golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
А что делать с go.mod при изменении версии GoLAng? ... особенно в сторону уменьшения: 1.22 -> 1.18 (например для проверки совместимости).
Ведь весь импорт для текущей версии (Go, модулей используемых...) - посыпался
Опыт показал (может есть другой способ):
- полностью удалить go.mod ...
- пересоздать его заново ... (проделать импорт где нужно, где уже делался - сам подхватит...)
Код: Выделить всё
$ go mod init <имя_модуля>
$ $ go mod tidy
См. подробно: Go: инструментарий (продолжение).
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
А 2-е условие ... не писать свой калькулятор и для каждой операции код - как великое множество в Интернет "ручных" реализаций, на многие десятки, а то и сотни строк, как вот, например: Язык Go. Консольный калькулятор (и таких великое множество), а найти в репозиториях GoLang и импортировать модуль/пакет, который реализует метод Eval() (по аналогии с Lisp или Python).
Сказано - сделано...
Поиском на https://pkg.go.dev/ по контексту "math eval" (https://pkg.go.dev/search?q=math+eval&m=package) нахожу (из нескольких):
Math Evaluatormeval (github.com/gSpera/meval)
Package Math Eval implements a math evaluator.
Imported by 1 | v0.1.1 published on Nov 16, 2019 | MIT
Обычно даже такого краткого описания пакетов достаточно чтобы начать их использовать...Math Eval is Yet Another Math Evaluator. for using eval is necessary to create an Evaluator with e := meval.New(). An evaluator contains the variables and the functions e.SetVar("x", 42). For evaluating expressions use the Eval method e.Eval("x+2").
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go: модули
1. Быстренько проверив пакет на показанных Examples... (обязательно на пригодность своим целям )
2. Набрасываю себе код:
Код: Выделить всё
package main
import (
"os"
"io"
"bufio"
"fmt"
"strings"
"github.com/gSpera/meval"
)
func main() {
e := meval.New()
e.SetFn("sum", sum)
r := bufio.NewReader(os.Stdin)
for {
print("? ")
str, err := r.ReadString('\n')
if err == io.EOF {
println() // ^D
break
}
if err != nil {
fmt.Printf("%v\n", err)
panic(err)
}
str = strings.TrimRight(str, " \n")
if 0 == len(str) { break; } // Enter
print(str, " = ")
value, err := e.Eval(str)
if err == nil {
fmt.Printf("%v\n", value)
} else {
fmt.Printf("ошибочное выражение: %v\n", err)
}
}
}
var sum = func(args ...float64) (float64, error) {
var sum float64
for _, arg := range args {
sum += arg
}
return sum, nil
}
var prod = func(args ...float64) (float64, error) {
var prod float64 = 1.0
for _, arg := range args {
prod *= arg
}
return prod, nil
}
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go build math.eval.go
math.eval.go:6:5: no required module provides package github.com/gSpera/meval; to add it:
go get github.com/gSpera/meval
Что решается:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go mod tidy
go: finding module for package github.com/gSpera/meval
go: downloading github.com/gSpera/meval v0.1.1
go: found github.com/gSpera/meval in github.com/gSpera/meval v0.1.1
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go build math.eval.go
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ ls -o math.eval*
-rwxrwxr-x 1 olej 2558703 фев 10 17:03 math.eval
-rw-rw-r-- 1 olej 1035 фев 10 16:44 math.eval.go
- Вложения
-
- math.eval.go
- (1.01 КБ) 40 скачиваний
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей