В чём разница между пакетами и модулями Golang?

Разбираюсь с golang, система линковки и подклчения сторонних библиотек несколько непонятна. Почему-то только с github можно подключать или я не разобрался. Ещё везде какая-то попорченная терминология с пакетами и модулями. Пожалуйста, объясните что есть что и зачем оно нужно, разницу при линковке и можно ли что-то подключить не с github? Пожалуйста, прикрепите свои русскоязычные источники. Достаточно много англоязычной литературы, однако с переводом на русский всё ,видимо,несколько путается.


Ответы (1 шт):

Автор решения: Pak Uula

Модуль - это дерево пакетов. Имя модуля задаётся в go.mod

Пакет - это набор исходных .go файлов, находящихся в одном каталоге и с одинаковой директивой package.

Файлы для одного пакета обязаны находиться в одном каталоге. Полное имя для пакета строится из имени модуля и пути к каталогу с файлами. Например,

  • в go.mod написано module example.org/mylib,
  • тогда все пакеты из модуля example.org/mylib должны быть в дочерних каталогах относительно go.mod.
  • и путь к каталогу определяет имя пакета.

Например, в дереве исходников вашей библиотеки есть файлы в каталоге ./cmd/root. Тогда эти файлы должны быть либо с директивой package root, либо package root_test. И полное имя пакета для этих файлов будет либо example.org/mylib/cmd/root, либо example.org/mylib/cmd/root_test[1].

Для автоматического поиска пакетов в Гугле придумали протокол goproxy Он реализован в GitHub, поэтому любой модуль, размещённый там, автоматически будет найден командами go get, go mod tidy, go build и подобными.

Но никто не ограничивает вас пользоваться только гитхабом. К примеру, поддержка goproxy есть в GitLab. Разворачиваете у себя на сервере гитлаб, настраиваете домены и прокси - и готово, go get начинает находить модули с вашим доменным именем.

На худой конец можно развернуть исходники стороннего модуля у себя в файловой системе, а в go.mod прописать зависимость с replace:

require example.org/some/module v1.01.02
replace example.org/some/module => ../some_module_src

В этом случае go build вообще не полезет в интернет, а возьмёт исходники модуля example.org/some/module из каталога ../some_module_src

[1] Пакет example.org/mylib/cmd/root_test должен содержать тесты для пакета example.org/mylib/cmd/root

→ Ссылка