Настройка правильной структуры каталогов Golang с помощью git для использования go build на пользовательских пакетах
Так что я почесал свою голову в этом в течение пары недель, и после прочтения нескольких источников о том, как $ go build
работает и три магических справочника, /bin
, /pkg
, /src
Мне до сих пор не очень понятно, как создавать проекты Golang с использованием пользовательских пакетов и как управлять git-репо.
Позвольте мне объяснить мою ситуацию более подробно:
Я работаю над проектом Go в каталоге проекта, который отличается от стандартного .../user/go/...
, Для всех моих проектов у меня есть другое дерево каталогов, которое структурировано так:
projects
| project-a
| project-b
| docs
| media
| scrum
| project-b <-- git repo containg Go structure
| .git
| gitignore.txt
| bin
| pkg
| src
| custom-package-a
| | foo.go
| custom-package-b
| | bar.go
| | main.go
| project-c
мой projects
Каталог может содержать проект любого типа: java, Unity3D, VisualC# и т. д., а затем в каждом проекте, в котором содержится репозиторий с исходным кодом.
Я был в состоянии построить успешно недавно, добавив projects/project-b/project-b
на мой GOPATH, поэтому он видит каталог src.
Так должна выглядеть структура файла для типичного проекта Go, даже если это правильно?
В моем GOPATH я удалил оригинальный путь к user/go
и только использовал каталог проекта только. При установке других пакетов из github они включаются в репозиторий, потому что GOPATH нигде не установлен, поэтому в моем репо есть эти разные подмодули. Разумно ли устанавливать внешние пакеты в репозиторий или они должны идти в другой каталог go? Я боюсь, что это может испортить репо.
Я могу включить
Мне нужно знать, правильно ли я использую пользовательские пакеты. Мое намерение состоит в том, чтобы использовать объектно-ориентированный подход с моей базой кода, и я рассматриваю каждый пакет как класс. Разумно ли делать собственные пакеты для обработки их как классов? Я счел необходимым избежать одноименных конфликтов между функциями и переменными. Пример: package-a.GetThing()
, package-b.GetThing()
, Обе функции дают схожий (не точный) вывод, но работают с разными наборами данных и требуют разной реализации.
Моя консоль находится в projects/project-b/project-b/
когда я использую go build
и это работает правильно. То же самое, если я перееду main.go
внутри Src.
Одна проблема заключается в том, что сборщик Go странным образом помещает скомпилированный двоичный файл в тот же каталог, который я вызываю go build
от. не должны go build
помещать его в bin
каталог, или мне нужно обеспечить выходной путь при использовании команды? Я знаю о Гобине, но, похоже, он не работает.
1 ответ
Начиная с Go 1.11 вам не нужно использовать $GOPATH.
Ты можешь использовать go mod init [your repo]
и просто беги go install
или же go build
Депс будет загружен для вас и go.mod
а также go.sum
файлы будут созданы для отслеживания deps.
Проверьте это README