Итак, я ломал голову над этим уже пару недель, и после прочтения нескольких источников о том, как $ 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, но похоже, что он не работает.
go install
- это то, что помещает двоичный файл в каталогbin
, а неgo build
. Обычно вы помещаете проект в GOPATH, а не наоборот, я бы прошел через Как писать код Go осторожно, так как любая рекомендация здесь просто отражает это. Вы, конечно, можете принудительно использовать любой шаблон, который хотите, как видите здесь (или изучить модули go с go1.11, для которых не нужен GOPATH) - person JimB   schedule 30.11.2018projects/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.2018mod
.$GOPATH
, похоже, скоро исчезнет, и это частая жалоба среди пользователей Go. - person jmaloney   schedule 03.12.2018