#架构 #分层 #领域特定语言 #守护者 #架构单元 # #过程

bin+lib guarding

Guarding 是代码、架构、分层的守护者。Guarding 创建了一个基于 ArchUnit 的架构守护 DSL。

5 个版本

0.2.6 2021 年 10 月 22 日
0.2.3 2021 年 8 月 4 日
0.2.1 2021 年 5 月 21 日
0.2.0 2021 年 5 月 21 日
0.1.1 2021 年 5 月 13 日

1038文本处理

MIT 许可证

90KB
2K SLoC

Guarding

Build crates.io docs.rs license

Guarding 是代码、架构、分层的守护者。使用 git hooks 和 DSL 设计守护规则。

灵感来源于 ArchUnit

Guarding Process

用法

使用 CLI

  1. 安装
cargo install guarding
  1. 创建 guarding.guarding 文件
package(".")::file.len should < 200;
package(".")::file.len should > 50;
  1. 运行
guarding .

使用 API

  • guarding_adapter,FFI 适配器,提供 Guarding API,
  • guarding_core,核心守护模型,
  • guarding_ident,识别不同语言:Java、JavaScript、Rust,
  • guarding_parser 解析 Guarding DSL

开发

工作流程

  1. 解析守护规则
  2. 将源代码解析为模型
  3. 使用模型捕获规则

DSL 捕获逻辑

  1. 使用 rule_levelrule_scope 过滤模型
  2. 运行表达式
  3. 运行断言

查询示例: https://github.com/nvim-treesitter/nvim-treesitter/tree/master/queries

Guarding - 类或结构体函数名

针对包

class(implementation "BaseParser")::name should endsWith "Parser";

class("java.util.Map") only accessed(["com.phodal.pepper.refactor.staticclass"]);
class(implementation "BaseParser")::name should not contains "Lexer";

针对 Java、JavaScript

# ::名 包含 "Controller";
# 中文分词:("..myapp..") 类名称中包含 "Controller"
class("..myapp..")::function.name should contains("Model");
# or
class("..myapp..")::function.name contains("");

针对 Rust 和 Golang

struct("..myapp..")::function.name should contains("Model");
# or
struct("..myapp..")::function.name contains("");

待办事项

待办事项

  • 模板
    • include(standard.guarding) 语法
  • 过滤
    • 按包标识符过滤
    • 按正则表达式过滤
    • 按实现过滤
    • 按扩展过滤
    • 按特质过滤
  • 限制实现命名
  • 限制文件数量
  • 限制包的子包大小(例如,Clean Architecture)。
  • 断言
    • 大小/长度比较
    • 字符串比较
      • 包含
      • 以...开始
      • 以...结束
    • 包操作
      • 访问
      • 位于
      • 依赖
  • 语言
    • Java
    • JavaScript(进行中)
    • TypeScript
    • Rust(进行中)
      • 类 & 函数
      • 导入
        • 基本导入
        • mod导入重构
      • 包转换

许可证

本代码根据MIT许可证分发。请参阅此目录中的LICENSE

依赖关系

约18-28MB
约569K SLoC