Original link: GitHub.com/go wave-beach…
Это базовая схема проекта приложения Go. Это не официальный стандарт, определенный основной командой разработчиков Go, однако это общий набор шаблонов компоновки для старых и новых проектов в экосистеме Go. Некоторые из этих режимов более популярны, чем другие. Он также имеет множество небольших улучшений, а также несколько каталогов поддержки, общих для любого достаточно большого практического приложения.
Если вы пытаетесь изучить Go или создаете PoC или игрушечный проект для себя, этот макет проекта не нужен. Начните с чего-нибудь очень простого (сmain.go
документации более чем достаточно). По мере роста вашего проекта помните, что важно поддерживать хорошую структуру кода, иначе вы получите беспорядочный код с множеством скрытых зависимостей и глобального состояния. Чем больше людей работает над проектом, тем больше структуры вам понадобится. На этом этапе важно представить общий способ управления пакетами/библиотеками. Когда у вас есть проект с открытым исходным кодом или когда вы знаете, что другие проекты импортируют код из вашего репозитория проекта, самое время иметь частный (он жеinternal
) пакет и код важны. Клонируйте репозиторий, оставьте то, что вам нужно, удалите все остальное!То, что оно есть, не означает, что вы должны использовать его все. Ни один из этих шаблонов не используется в каждом проекте. четноеvendor
Узоры тоже не универсальны.
Go 1.14 Go Modules
Наконец готов к производству. Если у вас нет особой причины не использовать их, используйтеGo Modules
. Если вы используете, вам не нужно беспокоиться о $GOPATH и о том, где находится ваш проект. в хранилищеgo.mod
Файлы в основном предполагают, что ваш проект размещен на Github, но это не обязательно. Путь к модулю может быть где угодно, хотя первый компонент пути к модулю должен иметь точку в имени (текущие версии Go больше не применяют этот модуль, но при использовании немного более старой версии, если нетmod
Не удивляйтесь, если сборка файла завершится ошибкой). Если вы хотите узнать больше, см. Проблемы37554
и32819
.
Этот макет проекта является общим и не пытается навязать определенную структуру пакета Go.
Это усилия сообщества. Если вы видите новую схему или считаете, что существующая схема нуждается в обновлении, отправьте сообщение о проблеме.
Чтобы получить помощь по именованию, форматированию и стилю, запуститеgofmt
иgolint
. Также обязательно ознакомьтесь с этими рекомендациями и советами по стилю кода Go:
- talks.golang.org/2014/ так что говори. …
- golang.org/doc/эффект я…
- blog.gowave.org/package - тогда...
- GitHub.com/gowaves/go/me…
- Style guideline for Go packages (rakyll/JBD)
видетьGo Project Layout
Узнайте больше справочной информации.
Дополнительные советы по именованию и организации пакетов и другой структуре кода:
- GopherCon EU 2018: Peter Bourgon - Best Practices for Industrial Programming
- GopherCon Russia 2018: Ashley McNamara + Brian Ketelsen - Go best practices.
- GopherCon 2017: Edward Muller - Go Anti-Patterns
- GopherCon 2018: Kat Zien - How Do You Structure Your Go Apps
Перейти в каталог
/cmd
Основа этого проекта.
Имя каталога для каждого приложения должно совпадать с именем исполняемого файла, который вы хотите (например,/cmd/myapp
).
Не помещайте слишком много кода в этот каталог. Если вы считаете, что код можно импортировать и использовать в других проектах, он должен находиться в/pkg
в каталоге. Если код нельзя использовать повторно или вы не хотите, чтобы его использовали другие, поместите код в/internal
в каталоге. Вы будете поражены тем, что сделают другие, так что будьте ясны в своих намерениях!
обычно имеют небольшойmain
функция, от/internal
и/pkg
Импорт каталога и код вызова, больше ничего.
Для примера см./cmd
содержание.
/internal
Частное приложение и код библиотеки. Здесь вы не хотите, чтобы другие люди импортировали код в свое приложение или библиотеку. Обратите внимание, что этот шаблон компоновки применяется самим компилятором Go. См. Go 1.4 для более подробной информации.release notes
. Обратите внимание, что вы не ограничены верхним уровнемinternal
содержание. На любом уровне дерева проекта может быть несколько внутренних каталогов.
При желании вы можете добавить некоторую дополнительную структуру во внутренний пакет, чтобы разделить общий и не общий внутренний код. Это не обязательно (особенно для небольших проектов), но хорошо иметь визуальные подсказки, чтобы показать предполагаемое использование пакета. Ваш фактический код приложения может быть помещен в/internal/app
каталог (например,/internal/app/myapp
), код, используемый этими приложениями, может быть помещен в/internal/pkg
каталог (например,/internal/pkg/myprivlib
).
/pkg
библиотечный код, который может использоваться внешними приложениями (например,/pkg/mypubliclib
). Другие проекты будут импортировать эти библиотеки в надежде, что они будут работать, так что дважды подумайте, прежде чем размещать что-либо здесь :-) Обратите внимание,internal
Каталоги — это лучший способ гарантировать, что частные пакеты не будут импортированы, поскольку это обеспечивается Go./pkg
Каталоги по-прежнему являются хорошим способом явно указать, что код в этом каталоге является хорошим способом безопасного использования другими. Автор Трэвис ДжеффриI'll take pkg over internal
сообщение в блоге предоставляетpkg
иinternal
Хороший обзор директорий и когда имеет смысл их использовать.
Это также способ сгруппировать код Go в одном месте, когда корневой каталог содержит множество компонентов и каталогов, отличных от Go, что упрощает запуск различных инструментов Go (как упоминалось в этих докладах: через GopherCon EU 2018).Best Practices for Industrial Programming
, GopherCon 2018: Kat Zien - How Do You Structure Your Go AppsиGoLab 2018 - Massimiliano Pippi - Project layout patterns in Go).
Если вы хотите узнать, какой популярный репозиторий Go использует этот шаблон макета проекта, проверьте/pkg
содержание. Это распространенный шаблон компоновки, но не все его принимают, а некоторые в сообществе Go не рекомендуют его.
Если проект вашего приложения действительно мал, а дополнительная вложенность не добавляет большой ценности (если вы действительно этого не хотите :-), то не используйте его. Когда он становится достаточно большим, ваш корневой каталог может стать очень громоздким (особенно если у вас много компонентов приложения, отличного от Go), подумайте об этом.
/vendor
Зависимости приложений (управляйте вручную или используйте свой любимый инструмент управления зависимостями, например новый встроенныйGo Modules
Функции).go mod vendor
команда создаст для вас/vendor
содержание. Обратите внимание: если вы не используете Go 1.14, который включен по умолчанию, вам может потребоватьсяgo build
добавить в команду-mod=vendor
логотип.
Если вы создаете библиотеку, не фиксируйте зависимости приложения.
Обратите внимание, что поскольку1.13
Позже Go также включил функцию прокси-модуля (по умолчанию с использованиемhttps://proxy.golang.org
в качестве прокси-сервера своего модуля). существуетhere
Узнайте больше об этом и посмотрите, соответствует ли он всем вашим потребностям и ограничениям. Если вам это нужно, то вам это вообще не нужноvendor
содержание.
Функция прокси-сервера внутреннего модуля по умолчанию заблокирована, и у Qiniuyun есть специальное обслуживание.模块代理
.
Каталог сервисных приложений
/api
Спецификация OpenAPI/Swagger, файл схемы JSON, файл определения протокола.
Для примера см./api
содержание.
каталог веб-приложений
/web
Компоненты, специфичные для веб-приложений: статические веб-ресурсы, серверные шаблоны и SPA.
Универсальный каталог приложений
/configs
Шаблон профиля или конфигурация по умолчанию.
положить вашиconfd
илиconsul-template
Здесь размещаются файлы шаблонов.
/init
Инициализация системы (systemd, upstart, sysv) и конфигурация диспетчера процессов/супервизора (runit, супервизор).
/scripts
Скрипты, которые выполняют различные сборки, установки, анализ и многое другое.
Эти сценарии делают Makefile корневого уровня небольшим и простым (например,https://github.com/hashicorp/terraform/blob/master/Makefile
).
Для примера см./scripts
содержание.
/build
Пакет и непрерывная интеграция.
Поместите конфигурацию вашего облака (AMI), контейнер (Docker), ОС (deb, rpm, pkg) и скрипты в/build/package
Под содержанием.
Поместите свой CI (travis, Circle, Drone) конфиг и скрипты в/build/ci
в каталоге. Обратите внимание, что некоторые инструменты непрерывной интеграции (например, Travis CI) очень требовательны к расположению файлов конфигурации. попробуй закинуть конфиг файл/build/ci
каталог, свяжите их с тем, где их ожидает инструмент CI (если возможно).
/deployments
Конфигурации и шаблоны развертывания IaaS, PaaS, системы и контейнера (docker-compose, kubernetes/helm, mesos, terraform, bosh). Обратите внимание, что в некоторых репозиториях (особенно в приложениях, развернутых с помощью kubernetes) этот каталог называется/deploy
.
/test
Дополнительные внешние тестовые приложения и тестовые данные. Вы всегда можете построить в соответствии с вашими потребностями/test
содержание. Для больших проектов имеет смысл иметь подкаталог данных. Например, вы можете использовать/test/data
или/test/testdata
(если вам нужно игнорировать содержимое каталога). Обратите внимание, что Go также игнорирует каталоги или файлы, начинающиеся с «.» или «_», поэтому существует больше гибкости в том, как называется каталог тестовых данных.
Для примера см./test
содержание.
другие каталоги
/docs
Дизайн и пользовательская документация (в дополнение к документации, созданной godoc).
Для примера см./docs
содержание.
/tools
Инструменты поддержки для этого проекта. Обратите внимание, что эти инструменты доступны из/pkg
и/internal
Код импорта каталога.
Для примера см./tools
содержание.
/examples
Примеры вашего приложения и/или публичной библиотеки.
Для примера см./examples
содержание.
/third_party
Внешние помощники, разветвленный код и другие сторонние инструменты (например, Swagger UI).
/githooks
Гит хуки.
/assets
Другие активы (изображения, логотипы и т. д.), которые можно использовать с репозиторием.
/website
Если вы не используете страницы Github, здесь вы размещаете данные веб-сайта своего проекта.
Для примера см./website
содержание.
Каталоги, которых у вас не должно быть
/src
Некоторые проекты Go имеютsrc
папку, но это обычно происходит, когда разработчик имеет опыт работы с Java, где это распространенный шаблон. Если можете, постарайтесь не использовать этот шаблон Java. Вы действительно не хотите, чтобы ваш код Go или проект Go выглядели как Java :-)
Не назначать уровень проектаsrc
Каталоги такие же, как то, что Go использует для своего рабочего пространства.src
каталог (например,How to Write Go Code
описано в) путаница.$GOPATH
Переменная среды указывает на вашу (текущую) рабочую область (по умолчанию она указывает на$HOME/go
). Это рабочее пространство включает верхний этаж/pkg
, /bin
и/src
содержание. Ваш фактический проект заканчивается/src
подкаталог в , поэтому, если ваш проект имеет/src
каталог, то путь к проекту будет таким:/some/path/to/workspace/src/your_project/src/your_code.go
. Обратите внимание, что в Go 1.11 можно помещать элементы вGOPATH
, но это не значит, что использовать этот режим макета — хорошая идея.
Badges
-
Go Report Card - It will scan your code with
gofmt
,go vet
,gocyclo
,golint
,ineffassign
,license
andmisspell
. Replacegithub.com/golang-standards/project-layout
with your project reference. -
GoDoc - It will provide online version of your GoDoc generated documentation. Change the link to point to your project.
-
Release - It will show the latest release number for your project. Change the github link to point to your project.
Notes
A more opinionated project template with sample/reusable configs, scripts and code is a WIP.