golang标准项目布局与组织结构最佳实践插件库golang-standards/project-layout的使用

Golang标准项目布局与组织结构最佳实践

概述

这是一个基本的Go应用程序项目布局。请注意,它在内容上是基本的,因为它只关注通用布局而不是具体内容。它也是高层次的,没有深入到如何进一步构建项目的细节中。

不是Go核心开发团队定义的官方标准,而是Go生态系统中常见的历史和新兴项目布局模式的集合。其中一些模式比其他模式更受欢迎。它还包含一些小型增强功能以及任何足够大的实际应用程序常见的几个支持目录。

Go目录结构

/cmd

项目的主要应用程序目录。每个应用程序的目录名称应与您想要的执行文件名称匹配(例如/cmd/myapp)。

不要在应用程序目录中放置大量代码。如果您认为代码可以被其他项目导入和使用,那么它应该放在/pkg目录中。如果代码不可重用或您不希望其他人重用,请将该代码放在/internal目录中。

通常有一个小的main函数,它导入并调用来自/internal/pkg目录的代码,仅此而已。

示例结构:

/cmd
  /myapp
    main.go

/internal

私有应用程序和库代码。这是您不希望其他人在其应用程序或库中导入的代码。请注意,Go编译器本身会强制执行此布局模式。

您可以选择在内部包中添加一些额外的结构来分离共享和非共享的内部代码。这不是必需的(特别是对于较小的项目),但拥有显示预期包用途的视觉提示是很好的。

示例结构:

/internal
  /app
    /myapp
      service.go
  /pkg
    /myprivlib
      utils.go

/pkg

可供外部应用程序使用的库代码(例如/pkg/mypubliclib)。其他项目会导入这些库并期望它们能够工作,因此在将某些内容放在这里之前请三思。

pkg目录仍然是明确传达该目录中的代码可以安全供他人使用的好方法。

示例结构:

/pkg
  /mypubliclib
    utils.go
    utils_test.go

/vendor

应用程序依赖项(手动管理或通过您喜欢的依赖项管理工具管理,如新的内置Go Modules功能)。

服务应用程序目录

/api

OpenAPI/Swagger规范、JSON模式文件、协议定义文件。

Web应用程序目录

/web

Web应用程序特定组件:静态Web资源、服务器端模板和SPA。

通用应用程序目录

/configs

配置文件模板或默认配置。

/init

系统初始化(systemd、upstart、sysv)和进程管理器/主管(runit、supervisord)配置。

/scripts

执行各种构建、安装、分析等操作的脚本。

/build

打包和持续集成。

/deployments

IaaS、PaaS、系统和容器编排部署配置和模板(docker-compose、kubernetes/helm、terraform)。

/test

额外的外部测试应用程序和测试数据。

其他目录

/docs

设计和用户文档(除了您的godoc生成的文档)。

/tools

此项目的支持工具。

/examples

您的应用程序和/或公共库的示例。

/third_party

外部帮助工具、分叉代码和其他第三方实用程序(例如Swagger UI)。

/githooks

Git钩子。

/assets

与您的存储库一起的其他资源(图像、徽标等)。

/website

如果您不使用GitHub页面,这是放置项目网站数据的地方。

示例项目结构

下面是一个完整的示例项目结构:

/myproject
  /cmd
    /myapp
      main.go
  /internal
    /app
      /myapp
        service.go
    /pkg
      /myprivlib
        utils.go
  /pkg
    /mypubliclib
      utils.go
      utils_test.go
  /api
    openapi.yaml
  /web
    static/
    templates/
  /configs
    config.yaml
  /scripts
    build.sh
  /build
    /ci
      .travis.yml
  /deployments
    docker-compose.yaml
  /test
    testdata/
  /docs
    README.md
  /examples
    demo.go
  go.mod
  go.sum
  README.md

注意事项

  • 对于学习Go或构建POC或简单项目,此项目布局过于复杂。从一个非常简单的开始(单个main.go文件和go.mod就足够了)
  • 随着项目增长,确保代码结构良好很重要
  • 使用Go 1.14+的Go Modules
  • 不要使用/src目录,这是Java模式

这个布局是通用的,不试图强加特定的Go包结构。它是社区努力的成果。


更多关于golang标准项目布局与组织结构最佳实践插件库golang-standards/project-layout的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang标准项目布局与组织结构最佳实践插件库golang-standards/project-layout的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 标准项目布局与组织结构最佳实践

标准项目布局介绍

golang-standards/project-layout 是 GitHub 上一个广受认可的 Golang 项目结构标准,虽然不是官方标准,但已被许多大型 Go 项目采用。

主要目录结构

├── cmd/                # 应用程序入口目录
│   └── your-app/       # 每个子目录对应一个可执行文件
│       └── main.go
├── internal/           # 私有应用程序代码库
│   ├── app/            # 应用层代码
│   └── pkg/            # 内部共享包
├── pkg/                # 可被外部应用导入的公共库代码
├── api/                # API 协议定义 (protobuf, swagger)
├── web/                # Web 应用特定组件
├── configs/            # 配置文件模板或默认配置
├── init/               # 系统初始化配置
├── scripts/            # 用于执行各种构建、安装、分析等操作的脚本
├── build/              # 打包和持续集成
├── deployments/        # IaaS、PaaS、系统和容器编排部署配置
├── test/               # 额外的外部测试应用和测试数据
├── docs/               # 设计和用户文档
├── tools/              # 项目支持工具
├── examples/           # 应用程序或公共库的示例
├── third_party/        # 外部辅助工具,fork 的代码等
├── githooks/           # Git hooks
├── assets/             # 其他资源文件
├── website/            # 项目网站数据
├── Makefile            # 项目构建管理
├── go.mod              # Go 模块定义
└── README.md           # 项目说明

实际应用示例

1. 创建项目结构

// cmd/myapp/main.go
package main

import (
	"fmt"
	"github.com/yourname/yourproject/internal/app/core"
)

func main() {
	fmt.Println("Starting application...")
	core.Run()
}
// internal/app/core/core.go
package core

func Run() {
	// 应用核心逻辑
	fmt.Println("Core application running")
}

2. 使用 pkg 目录暴露公共API

// pkg/mylib/mylib.go
package mylib

// PublicFunction 是一个可以被外部项目调用的公共函数
func PublicFunction() string {
	return "Public function called"
}

3. 配置管理示例

// configs/config.yaml
app:
  name: "My App"
  port: 8080
// internal/pkg/config/config.go
package config

import (
	"gopkg.in/yaml.v2"
	"os"
)

type AppConfig struct {
	Name string `yaml:"name"`
	Port int    `yaml:"port"`
}

func LoadConfig(path string) (*AppConfig, error) {
	config := &AppConfig{}
	
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()
	
	if err := yaml.NewDecoder(file).Decode(config); err != nil {
		return nil, err
	}
	
	return config, nil
}

最佳实践建议

  1. 模块化设计

    • 将业务逻辑放在 internal 目录下
    • 将可复用的公共代码放在 pkg 目录下
  2. 依赖管理

    # 初始化模块
    go mod init github.com/yourname/yourproject
    
    # 添加依赖
    go get github.com/some/dependency
    
  3. 构建与测试

    # 构建所有命令
    go build ./cmd/...
    
    # 运行测试
    go test ./...
    
  4. 版本控制

    • 忽略不必要的文件(.gitignore 示例):
      /bin/
      /tmp/
      *.exe
      *.test
      *.prof
      
  5. 文档生成

    • 使用 godoc 生成 API 文档
    • docs/ 目录下维护设计文档

项目布局工具

虽然 golang-standards/project-layout 本身不是一个可安装的库,但你可以使用以下工具来帮助维护项目结构:

  1. golangci-lint - 静态代码分析工具,可以检查项目结构

    golangci-lint run
    
  2. goimports - 自动格式化导入语句

    goimports -w .
    
  3. goreleaser - 自动化发布工具

    # .goreleaser.yml
    builds:
      - main: ./cmd/myapp/main.go
        binary: myapp
    

通过遵循这些最佳实践,你可以创建出结构清晰、易于维护的 Go 项目,便于团队协作和长期发展。

回到顶部