Go не накладывает ограничений на структуру проекта и расположение пакетов. Можно организовывать файлы в проекте как угодно, но есть рекомендации, придерживаясь которых вы сделаете свой проект понятным для других программистов.
Существует подход, который называется Standard Go Project Layout (см. на GitHub). В нём код проекта организуется в виде следующих директорий:
Директории в проекте
cmd
Если в проекте будет несколько бинарных файлов, создайте для них поддиректории в cmd
. Имена поддиректорий должны соответствовать именам исполняемых файлов.
- cmd
- client
main.go
- server
main.go
Если в проекте один исполняемый файл, исходные файлы можно разместить прямо в директории проекта. Старайтесь использовать один-два исходных файла. Остальной код нужно вынести в отдельные пакеты.
internal
Директория internal
содержит внутренние пакеты Go-проекта. На уровне компилятора запрещён импорт таких пакетов извне родительской директории internal
. Например, пакет .../root/client/internal/a/b
можно импортировать только в файле дерева директорий, которые начинаются с .../root/client
, и нельзя в .../root/server
или другом репозитории.
Рекомендуется размещать в директории internal
весь основной исходный код программы, разбитый на поддиректории с соответствующими пакетами. В зависимости от сложности проекта пакеты могут иметь разный уровень вложенности.
pkg
Директорию pkg
определите для пакетов, которые можно использовать в других проектах. Предпочтительнее для публичных проектов заводить отдельные репозитории.
vendor
Директория vendor
содержит внешние пакеты. C появлением в Go модулей все зависимости хранятся в кеше модуля. Поэтому директорию vendor
можно использовать на старых версиях Go или в том случае, если вы хотите быть уверены, что все зависимости находятся внутри директории проекта.
test
Как правило, в каждом пакете есть один или несколько тестовых файлов name_test.go
. Директорию test
можно использовать для комплексного тестирования с привлечением дополнительных инструментов.
docs
Директория docs
предназначена для ведения документации по проекту. Это может быть документация для пользователей или дополнение к документации, которую автоматически генерирует godoc
.
testdata
It’s a good practice to put all files required by your tests in a subdirectory called testdata
under your project’s directory. The testdata
directory has a special meaning in Go tooling that’s ignored by the Go build tool when compiling your program to ensure that testing artifacts don’t end up in your build.
Прочие директории
Вот ещё варианты директорий, которые встречаются в Go-проектах:
api
— дополнительные файлы для сервисов с API.assets
— дополнительные файлы-ресурсы. Например, картинки.build
— файлы для упаковки и непрерывной интеграции.configs
— файлы конфигураций.deployments/deploy
— файлы конфигураций и шаблоны для сервисов, операционных систем и контейнеров.examples
— примеры использования приложений и библиотек.sсripts
— скрипты для установки, настройки и других действий с проектом.tools
— инструменты для поддержки проекта. Могут быть написаны на Go c использованием пакетов проекта.website
— директория с файлами для веб-сайта проекта.
Это неполный список. Можно создавать директории с другими именами. Старайтесь давать такие имена, которые раскрывали бы назначение директории.
Дополнительные материалы
- Style guideline for Go packages
- Practical Go: Real world advice for writing maintainable Go programs
- Standard Go Project Layout
Лучшие практики
5. Project Structure
Let’s talk about combining packages together into a project. Commonly this will be a single git repository. In the future Go developers will use the terms module and project interchangeably.
Just like a package, each project should have a clear purpose. If your project is a library, it should provide one thing, say XML parsing, or logging. You should avoid combining multiple purposes into a single project, this will help avoid the dreaded
common
library.
Tip In my experience, the common repo ends up tightly coupled to its biggest consumer and that makes it hard to back-port fixes without upgrading both common and consumer in lock step, bringing in a lot of unrelated changes and API breakage along the way. If your project is an application, like your web application, Kubernetes controller, and so on, then you might have one or more
Link to originalmain
packages inside your project. For example, the Kubernetes controller I work on has a singlecmd/contour
package which serves as both the server deployed to a Kubernetes cluster, and a client for debugging purposes.
📂 Go | Последнее изменение: 28.08.2024 11:37