golang验证Clean Architecture依赖规则的插件库go-cleanarch的使用
Golang验证Clean Architecture依赖规则的插件库go-cleanarch使用
概述
go-cleanarch是一个用于检查Go项目中Clean Architecture规则的工具,它主要验证"依赖规则"和"模块间交互"。使用Clean Architecture有以下好处:
- 框架独立性:架构不依赖于某些功能丰富的软件库的存在
- 可测试性:业务规则可以在没有UI、数据库、Web服务器或任何其他外部元素的情况下进行测试
- UI独立性:UI可以轻松更改,而无需更改系统的其余部分
- 数据库独立性:你可以将Oracle或SQL Server换成Mongo、BigTable、CouchDB等
- 外部机构独立性:业务规则完全不了解外部世界
安装
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
更多关于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 主要检查以下依赖规则:
- 领域层(Entities)不应该知道或依赖任何其他层
- 用例层(Use Cases)只能依赖领域层
- 接口适配器层(Interface Adapters)可以依赖用例层和领域层
- 框架和驱动层(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
常见问题解决
- 误报问题:如果工具报告了合法的依赖关系,可以通过
ignored_dependencies
配置忽略 - 性能问题:对于大型项目,分析可能需要较长时间,可以考虑只对变更部分进行分析
- 循环依赖:go-cleanarch 也能帮助发现循环依赖问题
替代方案
如果 go-cleanarch 不能满足需求,也可以考虑:
- 使用
go list -json
分析依赖关系 - 编写自定义的静态分析工具
- 使用依赖可视化工具如
godepgraph
手动检查
go-cleanarch 是一个轻量级但强大的工具,可以帮助团队维持 Clean Architecture 的依赖规则,特别是在大型项目中保持代码结构的清晰和可维护性。