Примечание: этот вопрос связан с этим один , но два года очень долгое время в истории Go.
Каков стандартный способ организации проекта Go во время разработки?
Мой проект представляет собой отдельный пакет mypack
, поэтому я полагаю, что все файлы .go помещены в mypack
каталог.
Но затем я хотел бы проверить это во время разработки, поэтому мне нужен хотя бы файл, объявляющий main
пакет, чтобы я мог сделатьgo run trypack.go
Как мне это организовать? Нужно ли делать go install mypack
каждый раз, когда я хочу попробовать?
Ответы:
Я бы порекомендовал просмотреть эту страницу на Как написать код Go
Он документирует, как правильно структурировать ваш проект
go build
, а также как писать тесты. Тесты не должны быть cmd с использованиемmain
пакета. Они могут быть просто именованными функциями TestX как часть каждого пакета, а затемgo test
обнаружат их.Структура, предложенная в этой ссылке в вашем вопросе, немного устарела, теперь с выпуском Go 1. Вам больше не нужно размещать
pkg
каталог подsrc
. Единственные 3 директории, связанные со спецификацией, - это 3 в корне вашей GOPATH: bin, pkg, src. Под src вы можете просто поместить свой проектmypack
, а под ним - все ваши файлы .go, включая mypack_test.gogo build
затем встроит в корневой уровень pkg и bin.Так что ваша ГОПАТА может выглядеть так:
export GOPATH=$HOME/projects
Обновление: начиная с> = Go 1.11, система Module теперь является стандартной частью оснастки, и концепция GOPATH близка к устареванию.
источник
~
при настройке переменных среды , как и, например, оболочка busybox bourne. Попробуй сам:export BOB=~ && env | grep ^BOB
уступитBOB=/your/homedir
$HOME
работает в большем количестве оболочек~
, например, вfish
JDI имеет правильную информацию относительно использования
GOPATH
. Я хотел бы добавить, что если вы хотите иметь двоичный файл, вы можете добавить еще один уровень в каталоги.Выполнение
go build myproj/mypack
создастmypack
пакет вместе с его зависимостями. Выполнениеgo build myproj/myapp
создастmyapp
двоичный файл вместе с его зависимостями, которые, вероятно, включаютmypack
библиотеку.источник
Я изучил несколько проектов Go, и есть немало вариантов. Вы можете сказать, кто идет из C, а кто из Java, поскольку первый дамп почти всего в корневом каталоге проектов в
main
пакете, а второй, как правило, помещает все вsrc
каталог. Ни то, ни другое не является оптимальным. У каждого есть последствия, потому что они влияют на пути импорта и то, как другие могут их использовать.Чтобы получить наилучшие результаты, я разработал следующий подход.
Где
mypack.go
находитсяpackage mypack
иmain/mypack.go
(очевидно)package main
.Если вам нужны дополнительные файлы поддержки, у вас есть два варианта. Либо храните их все в корневом каталоге, либо поместите частные файлы поддержки в
lib
подкаталог. НапримерИли
Поместите файлы в
lib
каталог, только если они не предназначены для импорта другим проектом. Другими словами, если они являются частными файлами поддержки. В этом и заключается идеяlib
отделить общедоступные от частных интерфейсов.Делая так, вы получите хороший путь
myproj.org/mypack
для импорта, чтобы повторно использовать код в других проектах. Если вы используете,lib
то внутренние файлы поддержки будут иметь путь импорта, который указывает на этоmyproj.org/lib/mysupport
.При создании проекта, использование
main/mypack
, напримерgo build main/mypack
. Если у вас есть несколько исполняемых файлов, вы также можете разделить ихmain
без необходимости создавать отдельные проекты. напримерmain/myfoo/myfoo.go
иmain/mybar/mybar.go
.источник
cmd/nameOfMyExecutable
подкаталога для основного пакета (нужен толькоcmd/…
если у вас есть несколько команд; смотритеgolang.org/x/tools/cmd
; в противном случае его можно поменять местамиmain.go
на верхнем уровне). То, как вы этоgo install
сделаете, создаст исполняемый файл «main» (или «main.exe»). Кроме того, idiomatic должен использоватьinternal
подкаталог для внутреннего подпакета в пакете / программе, который не предназначен для использования в другом месте (ожидается, что в будущих версиях Go никто другой не будет импортироватьinternal
пакеты, сделанные таким образом).Я нахожу очень полезным понять, как организовать код на Голанге в этой главе http://www.golang-book.com/11 книги, написанной Калебом Докси
источник
Похоже, стандартного способа организации проектов Go не существует, но https://golang.org/doc/code.html содержит рекомендации для большинства проектов. Ответ jdi хорош, но если вы используете github или bitbucket и у вас есть дополнительные библиотеки, вы должны создать следующую структуру:
Делая это таким образом, вы можете создать отдельный репозиторий для mylib, который может использоваться для других проектов и может быть получен с помощью «go get». Ваш проект mypack может импортировать вашу библиотеку, используя "github.com/username/mylib". Чтобы получить больше информации:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
источник
Храните файлы в одном каталоге и используйте их
package main
во всех файлах.Затем запустите:
источник
Давайте исследуем, как
go get repository_remote_url
команда управляет структурой проекта$GOPATH
. Если мы сделаем это,go get github.com/gohugoio/hugo
он будет клонировать хранилище подЭто хороший способ создать начальный путь проекта . Теперь давайте рассмотрим, какие типы проектов существуют и как организованы их внутренние структуры. Все проекты Голанга в сообществе можно отнести к категории
Libraries
(без исполняемых двоичных файлов)Single Project
(содержит только 1 исполняемый файл)Tooling Projects
(содержит несколько исполняемых файлов)Обычно файлы проекта golang могут быть упакованы в соответствии с любыми принципами проектирования, такими как DDD , POD
Большинство доступных проектов Go следуют этому пакетно-ориентированному дизайну
Пакетно-ориентированный дизайн поощряет разработчика сохранять реализацию только внутри своих собственных пакетов, за исключением
/internal
пакета, который эти пакеты не могут связать друг с другом.Библиотеки
/internal
Пакет в основном используется, чтобы скрыть реализацию от других проектов.Единый проект
Инструментальные проекты
cmd/
Пакет управляет количеством двоичных файлов (инструментов), которые мы хотим построитьисточник