Организация структуры проекта с несколькими модулями Golang
В 1 проекте будут содержаться 3 различные программы: Repeater, Controller и Executor, полагаю что необходимо под каждый выделить свой модуль. И я хочу сделать 1 модуль который они будут импортировать с некоторым набором общих для них функций. Пока что максиум что вышло в каждый модуль добавить копии файла с этими общими функциями, что выглядит не очень. Я часа 4 ковырялся в статьях и видео уроках но так и не смог из 1 несчастного модуля импортировать функции в другой неменее несчастный модуль. Прошу помощи как можно подробнее обьясните как сделать то что я хочу если это вообще возможно.
Ответы (1 шт):
Способов как минимум три:
- гитхаб,
- инструкция
replaceвgo.mod - воркспейсы
ИМХО, для разработки сложного проекта из нескольких приложений и библиотек лучше всего сделать воркспейс.
Github
Разместите библиотеку общего кода в гитхабе: https://github.com/videxerion/common,
в приложениях импортируйте общий код как import "github.com/videxerion/common"
Го автоматически найдёт и скачает модуль библиотеки.
Основное неудобство - после каждого изменения нужно пушить код в гитхаб, делать релиз, ждать, пока обновится кэш в goproxy.
Если вы в будущем планируете превратить ваш общий код в библиотеку для сторонних разработчиков, то гитхаб - самый правильный путь. Но на время разработки нужно, чтобы Го находил локальную копию библиотеки.
go.mod replace
для разработки без гитхаба. Ваши модули во время разработки находятся в файловой системе.
Имя модуля может быть таким же (github.com/videxerion/common), но лежать он будет не в гитхабе, а на диске в каталоге /path/to/common
импорт будут выглядеть так же:
import "github.com/videxerion/common"
Как го будет находить этот модуль, если его нет в гитхабе? Для этого добавьте во go.mod для Repeater, Controller и Executor такие строки:
require github.com/videxerion/common v0.0.0
replace github.com/videxerion/common => /path/to/common
Тогда при сборке приложений го будут искать модуль github.com/videxerion/common в каталоге /path/to/common.
Workspace
Воркспейсы в Go позволяют находить модули без переписывания go.mod.
Предполжим, вы разложили ваши проекты по каталогам:
workspace/Executor
workspace/Controller
workspace/common
workspace/Repeater
В каталоге workspace выполните команду:
go work init
Затем добавьте все ваши проекты в созданный воркспейс:
go work use ./Executor
go work use ./Controller
go work use ./common
go work use ./Repeater
В каталоге workspace обнаружится файл go.work с таким содержимым:
go 1.21.3
use (
./Controller
./Executor
./Repeater
./common
)
Магия воркспейса в том, что пакеты сначала ищутся в модулях воркспейса, и только затем в GOPATH и агрегаторе пакетов proxy.golang.org
То есть ваш модуль может называться github.com/videxerion/common, в go.mod приложений нет никаких replace, но благодаря воркспейсу код будет браться из ./workspace/common.
Запускать можно как из каталога воркспейса go run ./Controller так и внутри каталога Controller go run .
Воркспейс даже можно сохранить в гит, сделав каталоги с кодом гит-модулями