#架构 #cargo 子命令 #子命令 #cargo #测试 #插件

app cargo-archtest

基于规则的架构测试的 arch_test_core 命令行界面

6 个版本

0.1.8 2021 年 6 月 15 日
0.1.7 2021 年 6 月 14 日

#391Cargo 插件

AGPL-3.0

145KB
4K SLoC

ArchTest

crates.io crates.io codecov license Crates.io Crates.2io

ArchTest 是一个基于规则的架构测试工具。它对指定的 Rust 项目进行静态分析,以提取使用关系。

功能

  • 按层级或模块级检测循环依赖
  • 禁止父级访问
  • 定义层关系,如 MayNotAccessMayOnlyAccessMyNotBeAccessedByMayOnlyBeAccessedBy
  • 等等,请参阅文档。

安装

您可以选择将其安装为 Cargo 的子命令或作为您开发依赖项中的包。

# Sub command
cargo install cargo-archtest --force

# Package
[dev-dependencies]
arch_test_core = "*"

如何使用

使用 Cargo 子命令

在 cargo 根路径中定义一个名为 architecture.json 的文件。根据 Specification 结构体填充它。示例

{
  "layer_names": ["analyzer", "parser", "domain_values", "entities", "materials", "services", "tests", "utils"],
  "access_rules": [
    "NoLayerCyclicDependencies",
    "NoModuleCyclicDependencies",
    "NoParentAccess",
    {
      "MayNotAccess": {
        "accessor": "parser",
        "accessed": ["analyzer"],
        "when_same_parent": true
      }
    },
    {
      "MayOnlyBeAccessedBy": {
        "accessors": ["services", "tests"],
        "accessed": "materials",
        "when_same_parent": false
      }
    },
    {
      "MayNotBeAccessedBy": {
        "accessors": ["materials", "domain_values", "entities", "utils"],
        "accessed": "services",
        "when_same_parent": true
      }
    }
  ]
}

使用 Rust 测试

您可以使用 Architecture 结构体来定义您的架构。然后检查它是否有错误。

let architecture = Architecture::new(hash_set!["analyzer".to_owned(), "parser".to_owned(), ...])
.with_access_rule(NoParentAccess)
.with_access_rule(NoModuleCyclicDependencies)
.with_access_rule(NoLayerCyclicDependencies)
...
.with_access_rule(MayNotAccess::new(
    "materials".to_owned(),
    hash_set!["tests".to_owned()],
    true,
));
let module_tree = ModuleTree::new("src/lib.rs");
assert!(architecture.validate_access_rules().is_ok());
assert!(architecture.check_access_rules(&module_tree).is_ok());

如果您对错误感兴趣,可以像这样格式化打印它

architecture.check_access_rules(&module_tree).err().unwrap().print(module_tree.tree());

持续集成

您可以使用以下任一方法在持续集成中使用它。如果您决定在 GitHub 上使用 Cargo 子命令,以下代码片段将允许您测试项目。

arch_test:
  name: ArchTest
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v2
    - uses: actions-rs/install@v0.1
      with:
        crate: cargo-archtest
        version: latest
    - run: cargo archtest

依赖

~7.5MB
~138K SLoC