Страница 4 из 4
Go: модули
Добавлено: 19 фев 2024, 03:07
Olej
Olej писал(а): ↑19 фев 2024, 02:39
это было то как создать и описать модуль.
Более детальные публикации по управлению версиями в системе модулей:
Управление зависимостями в Go
19 дек 2023 в 09:18
Внутрення техника выбора версий в системе модулей, в общем случае, совсем не простая ... но это, может и не обязательно знать.
Модули Go и управление зависимостями
21, июн. 2023
Как писать Go код (с использованием модулей)
воскресенье, 21 марта 2021 г.
Организация кода
Программы Go организованы в пакеты. Пакет - это набор исходных файлов в одном каталоге, которые скомпилированы вместе. Функции, типы, переменные и константы, определенные в одном исходном файле, видны всем другим исходным файлам в том же пакете.
Репозиторий содержит один или несколько модулей. Модуль - это набор связанных пакетов Go, которые выпускаются вместе. Репозиторий Go обычно содержит только один модуль, расположенный в корне репозитория. Файл с именем go.mod объявляет путь к модулю: префикс пути импорта для всех пакетов в модуле. Модуль содержит пакеты в каталоге, содержащем его файл go.mod, а также подкаталоги этого каталога до следующего подкаталога, содержащего другой файл go.mod (если есть).
Обратите внимание, что вам не нужно публиковать свой код в удаленном репозитории перед его сборкой. Модуль может быть определен локально без принадлежности к репозиторию. Тем не менее, это хорошая привычка организовывать свой код так, как будто вы когда-нибудь его опубликуете.
Путь к каждому модулю не только служит префиксом пути импорта для его пакетов, но также указывает, где команда go должна искать его для его загрузки. Например, чтобы загрузить модуль golang.org/x/tools, команда go будет обращаться к репозиторию, указанному
https://golang.org/x/tools.
Путь импорта - это строка, используемая для импорта пакета. Путь импорта пакета - это путь к модулю, соединенный с его подкаталогом внутри модуля. Например, модуль github.com/google/go-cmp содержит пакет в каталоге cmp/. Путь импорта этого пакета - github.com/google/go-cmp/cmp. Пакеты в стандартной библиотеке не имеют префикса пути к модулю.
Go: модули
Добавлено: 21 фев 2024, 15:27
Olej
Задача: публикация модуля в Интернет, на публичном GIT репозитории... для импорта из сети.
1. Репозиторий под проект нужно создать ... пусть это будет GitHub (хотя с таким же успехом может быть GitLab или Bitbucket):
- Снимок экрана от 2024-02-21 05-08-07.png (196.66 КБ) 624 просмотра
Жму New:
- Снимок экрана от 2024-02-21 05-11-32.png (191.03 КБ) 624 просмотра
Имею заготовку пустого репозитория:
- Снимок экрана от 2024-02-21 05-12-10.png (154.42 КБ) 624 просмотра
Go: модули
Добавлено: 21 фев 2024, 15:29
Olej
Olej писал(а): ↑21 фев 2024, 15:27
Имею заготовку пустого репозитория:
2. Клонирую этот пустой репозиторий для будущего модуля:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/github$ git clone https://github.com/olej-tsil-51/degree.git
Клонирование в «degree»...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Получение объектов: 100% (5/5), готово.
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/github$ ls -a degree/
. .. .git .gitignore LICENSE README.md
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/github$ du -hs degree/
196K degree/
Go: модули
Добавлено: 21 фев 2024, 15:34
Olej
Olej писал(а): ↑21 фев 2024, 15:29
Клонирую этот пустой репозиторий для будущего модуля:
3. Наполняю каталог содержимым...
- копирую Go модуль:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ cat degree.go
package degrees
import "math"
func d2r(dg float64) float64 {
return dg / 180 * math.Pi
}
func Cos(dg float64) float64 {
return math.Cos(d2r(dg))
}
func Sin(dg float64) float64 {
return math.Sin(d2r(dg))
}
func Tan(dg float64) float64 {
return math.Tan(d2r(dg))
}
Это модуль тригонометрии для аргументов выраженных в угловых градусах ... чисто тестовая задача.
- делаю манифест модуля:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ go mod init github.com/olej-tsil-51/degree
go: creating new go.mod: module github.com/olej-tsil-51/degree
go: to add module requirements and sums:
go mod tidy
Go: модули
Добавлено: 21 фев 2024, 15:37
Olej
Olej писал(а): ↑21 фев 2024, 15:34
3. Наполняю каталог содержимым...
4. Теперь всё это завожу под контроль GIT:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ git status
Текущая ветка: main
Эта ветка соответствует «origin/main».
Изменения, которые не в индексе для коммита:
(используйте «git add <файл>...», чтобы добавить файл в индекс)
(используйте «git restore <файл>...», чтобы отменить изменения в рабочем каталоге)
изменено: degree.go
изменено: go.mod
индекс пуст (используйте «git add» и/или «git commit -a»)
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ git add .
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ git status
Текущая ветка: main
Эта ветка соответствует «origin/main».
Изменения, которые будут включены в коммит:
(используйте «git restore --staged <файл>...», чтобы убрать из индекса)
изменено: degree.go
изменено: go.mod
Зафиксировать изменения:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ git commit -m 'module degrees'
[main 6b3352a] module degrees
2 files changed, 2 insertions(+)
И синхронизировать с GitHub:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/degree$ git push
Username for 'https://github.com': olej-tsil-51
Password for 'https://olej-tsil-51@github.com':
Перечисление объектов: 7, готово.
Подсчет объектов: 100% (7/7), готово.
При сжатии изменений используется до 40 потоков
Сжатие объектов: 100% (4/4), готово.
Запись объектов: 100% (4/4), 380 байтов | 380.00 КиБ/с, готово.
Всего 4 (изменений 2), повторно использовано 0 (изменений 0), повторно использовано пакетов 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/olej-tsil-51/degree.git
1d5fd2c..6b3352a main -> main
Всё, с модулем на этом закончил...
Go: модули
Добавлено: 21 фев 2024, 15:43
Olej
Olej писал(а): ↑21 фев 2024, 15:37
Всё, с модулем на этом закончил...
Начинаю строить главную вызывающую программу...
5. Рядом с локальным GIT репозиторием создаю каталог main (или с любым другим именем):
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github$ tree -L 2
.
├── degree
│ ├── degree.go
│ ├── go.mod
│ ├── LICENSE
│ └── README.md
└── main
├── go.mod
├── go.sum
└── head.go
2 directories, 7 files
Пишу туда пакет main Go приложения:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat head.go
package main
import (
"fmt"
"github.com/olej-tsil-51/degree"
)
func main() {
const угол = 30.
fmt.Printf("синус %f градусов = %f\n", угол, degrees.Sin(угол))
}
Go: модули
Добавлено: 21 фев 2024, 15:54
Olej
Olej писал(а): ↑21 фев 2024, 15:43
5. Рядом с локальным GIT репозиторием создаю каталог main (или с любым другим именем):
6. Теперь нужно импорт из сети модуля...
Сделал манифест модуля гланой программы ... инициализировал:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go mod init degree
go: creating new go.mod: module degree
go: to add module requirements and sums:
go mod tidy
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat go.mod
module degree
go 1.22.0
Импорт (вручную указал):
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go get github.com/olej-tsil-51/degree
go: downloading github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f
go: added github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f
Вот он прописался
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat go.mod
module degree
go 1.22.0
require github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f // indirect
А ещё лучше так - чтобы сам нашёл нужный импорт:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go mod tidy
Манифест слегка меняется:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat go.mod
module degree
go 1.22.0
require github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f
Отладочная версия модуля присвоена: v0.0.0-20240221053336-1d5fd2c9133f
В любом случае, оно скачивает из сети (GitHub) локально вот сюда:
Код: Выделить всё
olej@R420:~/go/pkg/mod/github.com/olej-tsil-51$ ls -o `go env GOPATH`/pkg/mod/github.com/olej-tsil-51/*133f
итого 16
-r--r--r-- 1 olej 272 фев 21 08:54 degree.go
-r--r--r-- 1 olej 49 фев 21 08:54 go.mod
-r--r--r-- 1 olej 1071 фев 21 08:54 LICENSE
-r--r--r-- 1 olej 19 фев 21 08:54 README.md
Go: модули
Добавлено: 21 фев 2024, 15:56
Olej
Olej писал(а): ↑21 фев 2024, 15:54
6. Теперь нужно импорт из сети модуля...
7. Всё! Можно выполнять:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go run head.go
синус 30.000000 градусов = 0.500000
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go run .
синус 30.000000 градусов = 0.500000
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go build head.go
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ ./head
синус 30.000000 градусов = 0.500000
Теперь любой main в любом конце мира может использовать этот модуль
Go: модули
Добавлено: 21 фев 2024, 16:07
Olej
Olej писал(а): ↑21 фев 2024, 15:56
Всё!
Olej писал(а): ↑21 фев 2024, 15:56
Теперь любой main в любом конце мира может использовать этот модуль
Но и это ещё не всё
Мне же как-то отлаживать нужно модуль (особенно если он посложнее)...
Не commit/push же GitHub по каждому чиху
Но я могу переключиться на импорт из локального GIT репо, из которого всё изначально и загружалось в GitHub:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github$ tree -L 2
.
├── degree
│ ├── degree.go
│ ├── go.mod
│ ├── LICENSE
│ └── README.md
└── main
├── go.mod
├── go.sum
└── head.go
2 directories, 7 files
Было:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat go.mod
module degree
go 1.22.0
require github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f
Переназначаю:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ go mod edit -replace github.com/olej-tsil-51/degree.git=../degree
Стало:
Код: Выделить всё
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/looking.for/GIT/github/main$ cat go.mod
module degree
go 1.22.0
require github.com/olej-tsil-51/degree v0.0.0-20240221053336-1d5fd2c9133f
replace github.com/olej-tsil-51/degree.git => ../degree
И теперь импорт идёт из локального GIT.
А когда он будет удовлетворять отладку - синхронизировать его (commit/push) как выше...