Go: модули

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 19 фев 2024, 03:07

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. Пакеты в стандартной библиотеке не имеют префикса пути к модулю.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:27

Задача: публикация модуля в Интернет, на публичном GIT репозитории... для импорта из сети.
1. Репозиторий под проект нужно создать ... пусть это будет GitHub (хотя с таким же успехом может быть GitLab или Bitbucket):
Снимок экрана от 2024-02-21 05-08-07.png
Снимок экрана от 2024-02-21 05-08-07.png (196.66 КБ) 155 просмотров
Жму New:
Снимок экрана от 2024-02-21 05-11-32.png
Снимок экрана от 2024-02-21 05-11-32.png (191.03 КБ) 155 просмотров
Имею заготовку пустого репозитория:
Снимок экрана от 2024-02-21 05-12-10.png
Снимок экрана от 2024-02-21 05-12-10.png (154.42 КБ) 155 просмотров

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:29

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/

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:34

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:37

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
Всё, с модулем на этом закончил...
Вложения
Снимок экрана от 2024-02-21 06-43-33.png
Снимок экрана от 2024-02-21 06-43-33.png (124.09 КБ) 154 просмотра

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:43

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(угол))
}

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:54

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 15:56

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 в любом конце мира может использовать этот модуль :!:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: модули

Непрочитанное сообщение Olej » 21 фев 2024, 16:07

Olej писал(а):
21 фев 2024, 15:56
Всё!
Olej писал(а):
21 фев 2024, 15:56
Теперь любой main в любом конце мира может использовать этот модуль
Но и это ещё не всё :lol:
Мне же как-то отлаживать нужно модуль (особенно если он посложнее)...
Не commit/push же GitHub по каждому чиху :!: :oops:
Но я могу переключиться на импорт из локального 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) как выше...

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей