Настройка правильной структуры каталогов 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, или мне нужно принудительно указать путь вывода при использовании команды? Мне известно о GOBIN, но похоже, что он не работает.


person GhostRavenstorm    schedule 30.11.2018    source источник
comment
go install - это то, что помещает двоичный файл в каталог bin, а не go build. Обычно вы помещаете проект в GOPATH, а не наоборот, я бы прошел через Как писать код Go осторожно, так как любая рекомендация здесь просто отражает это. Вы, конечно, можете принудительно использовать любой шаблон, который хотите, как видите здесь (или изучить модули go с go1.11, для которых не нужен GOPATH)   -  person JimB    schedule 30.11.2018
comment
GOPATH обычно не является частью репозитория git. Более типично, если существуют projects/go/src/my.site/project-b/.git и projects/go/src/my.site/project-b/custom-package-a/foo.go, причем /my.site/ сегменты являются необязательными. См. Как писать код Go. Это также предотвратит запутывание репозитория сторонним кодом (если вы, конечно, не захотите, и в этом случае он перейдет в projects/go/src/my.site/project-b/vendor.   -  person Peter    schedule 30.11.2018
comment
Прочтите, как писать код Go, и придерживайтесь его.   -  person Volker    schedule 01.12.2018
comment
Я предполагаю, что "Как писать код Go" скоро будет обновлен, поскольку в нем даже не упоминается mod. $GOPATH, похоже, скоро исчезнет, ​​и это частая жалоба среди пользователей Go.   -  person jmaloney    schedule 03.12.2018


Ответы (1)


Начиная с Go 1.11 вам не нужно использовать $ GOPATH.

Вы можете использовать go mod init [your repo] и просто запустить go install или go build. Deps будут загружены для вас, и будут созданы файлы go.mod и go.sum для отслеживания deps.

Ознакомьтесь с этим README

person jmaloney    schedule 30.11.2018