golang验证Clean Architecture依赖规则的插件库go-cleanarch的使用

Golang验证Clean Architecture依赖规则的插件库go-cleanarch使用

概述

go-cleanarch是一个用于检查Go项目中Clean Architecture规则的工具,它主要验证"依赖规则"和"模块间交互"。使用Clean Architecture有以下好处:

  1. 框架独立性:架构不依赖于某些功能丰富的软件库的存在
  2. 可测试性:业务规则可以在没有UI、数据库、Web服务器或任何其他外部元素的情况下进行测试
  3. UI独立性:UI可以轻松更改,而无需更改系统的其余部分
  4. 数据库独立性:你可以将Oracle或SQL Server换成Mongo、BigTable、CouchDB等
  5. 外部机构独立性:业务规则完全不了解外部世界

安装

go install github.com/roblaszczak/go-cleanarch@latest

注意:go-cleanarch仅在Linux上测试过,在OS X上应该也能工作,在Windows上可能无法正常工作。

项目结构要求

go-cleanarch假设的文件结构如下:

[GOPATH]/[PACKAGE_NAME]/[LAYER_NAME]

[GOPATH]/[PACKAGE_NAME]/[MODULE_NAME]/[LAYER_NAME]

例如:

go/src/github.com/roblaszczak/awesome-app
├── auth
│   ├── domain
│   ├── application
│   └── interfaces
├── content
│   ├── domain
│   │   ├── submodule1
│   │   ├── submodule2
│   │   └── etc.
│   ├── application
│   └── interfaces
└── frontend
    ├── domain
    ├── application
    └── interfaces

允许的层名称

默认层名称如下:

var LayersAliases = map[string]Layer{
    // Domain
    "domain":   LayerDomain,
    "entities": LayerDomain,

    // Application
    "app":         LayerApplication,
    "application": LayerApplication,
    "usecases":    LayerApplication,
    "usecase":     LayerApplication,
    "use_cases":   LayerApplication,

    // Interfaces
    "interfaces": LayerInterfaces,
    "interface":  LayerInterfaces,
    "adapters":   LayerInterfaces,
    "adapter":    LayerInterfaces,

    // Infrastructure
    "infrastructure": LayerInfrastructure,
    "infra":          LayerInfrastructure,
}

使用示例

基本使用

在当前目录运行:

go-cleanarch

在指定目录运行:

go-cleanarch go/src/github.com/roblaszczak/awesome-cms

如果架构无效,进程将退出代码1,否则将退出0。

忽略测试文件

如果需要忽略*_test.go文件:

go-cleanarch -ignore-tests

忽略特定包

如果需要允许特定的禁止导入:

go-cleanarch -ignore-package=github.com/roblaszczak/go-cleanarch/examples/ignore-package/app

自定义层名称

可以设置特定的层名称:

go-cleanarch -domain dom -application appli -interfaces int -infrastructure outer

测试

运行测试:

make test

运行代码风格测试:

make qa

示例项目结构

以下是一个符合Clean Architecture的Go项目示例:

myproject/
├── cmd/
│   └── main.go
├── internal/
│   ├── domain/
│   │   ├── user.go
│   │   └── repository.go
│   ├── application/
│   │   ├── user_service.go
│   │   └── usecases.go
│   └── interfaces/
│       ├── http/
│       │   └── user_handler.go
│       └── repository/
│           ├── mysql/
│           │   └── user_repository.go
│           └── memory/
│               └── user_repository.go
└── go.mod

在这个结构中:

  • domain层包含业务实体和接口
  • application层包含业务逻辑和用例
  • interfaces层包含适配器和外部通信的实现

go-cleanarch会验证这些层之间的依赖关系是否符合Clean Architecture规则。


更多关于golang验证Clean Architecture依赖规则的插件库go-cleanarch的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang验证Clean Architecture依赖规则的插件库go-cleanarch的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-cleanarch: Golang Clean Architecture 依赖规则验证工具

go-cleanarch 是一个用于验证 Go 项目是否符合 Clean Architecture 依赖规则的静态分析工具。它可以帮助开发者确保项目中的依赖关系遵循 Clean Architecture 的核心原则:内层不依赖外层。

核心功能

go-cleanarch 主要检查以下依赖规则:

  1. 领域层(Entities)不应该知道或依赖任何其他层
  2. 用例层(Use Cases)只能依赖领域层
  3. 接口适配器层(Interface Adapters)可以依赖用例层和领域层
  4. 框架和驱动层(Frameworks & Drivers)可以依赖所有内层

安装

go install github.com/roblaszczak/go-cleanarch@latest

基本使用

1. 创建配置文件

在项目根目录创建 .go-cleanarch.yaml 配置文件:

layers:
  - id: entities
    name: Domain
    packages:
      - "github.com/yourproject/domain/..."
  
  - id: usecases
    name: Use Cases
    packages:
      - "github.com/yourproject/usecases/..."
    allowed_dependencies:
      - entities
  
  - id: interfaces
    name: Interfaces
    packages:
      - "github.com/yourproject/interfaces/..."
    allowed_dependencies:
      - usecases
      - entities
  
  - id: frameworks
    name: Frameworks
    packages:
      - "github.com/yourproject/frameworks/..."
    allowed_dependencies:
      - interfaces
      - usecases
      - entities

2. 运行验证

go-cleanarch -config .go-cleanarch.yaml

示例项目结构

以下是一个符合 Clean Architecture 的项目结构示例:

project/
├── domain/
│   ├── user.go       # 实体定义
├── usecases/
│   ├── user/
│   │   ├── create.go  # 用例实现
├── interfaces/
│   ├── http/
│   │   ├── user.go    # HTTP 处理程序
│   ├── persistence/
│   │   ├── user.go    # 存储接口
├── frameworks/
│   ├── db/
│   │   ├── postgres/  # 具体数据库实现
│   ├── web/
│   │   ├── echo/      # 具体 web 框架实现

高级配置

忽略特定依赖

可以在配置中添加 ignored_dependencies 来忽略某些合法的依赖:

layers:
  - id: usecases
    name: Use Cases
    packages:
      - "github.com/yourproject/usecases/..."
    allowed_dependencies:
      - entities
    ignored_dependencies:
      - "github.com/pkg/errors"  # 允许使用 errors 包

多模块支持

对于大型项目,可以配置多个模块:

modules:
  - name: User Module
    layers:
      - id: user_entities
        name: User Domain
        packages:
          - "github.com/yourproject/user/domain/..."
  
  - name: Order Module
    layers:
      - id: order_entities
        name: Order Domain
        packages:
          - "github.com/yourproject/order/domain/..."

集成到 CI/CD

可以将 go-cleanarch 集成到 CI 流程中,例如 GitHub Actions:

name: Clean Architecture Validation

on: [push, pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-go@v2
        with:
          go-version: '1.20'
      - run: go install github.com/roblaszczak/go-cleanarch@latest
      - run: go-cleanarch -config .go-cleanarch.yaml

常见问题解决

  1. 误报问题:如果工具报告了合法的依赖关系,可以通过 ignored_dependencies 配置忽略
  2. 性能问题:对于大型项目,分析可能需要较长时间,可以考虑只对变更部分进行分析
  3. 循环依赖:go-cleanarch 也能帮助发现循环依赖问题

替代方案

如果 go-cleanarch 不能满足需求,也可以考虑:

  • 使用 go list -json 分析依赖关系
  • 编写自定义的静态分析工具
  • 使用依赖可视化工具如 godepgraph 手动检查

go-cleanarch 是一个轻量级但强大的工具,可以帮助团队维持 Clean Architecture 的依赖规则,特别是在大型项目中保持代码结构的清晰和可维护性。

回到顶部