6 个版本
0.1.8 | 2021 年 6 月 15 日 |
---|---|
0.1.7 | 2021 年 6 月 14 日 |
#391 在 Cargo 插件
145KB
4K SLoC
ArchTest
ArchTest 是一个基于规则的架构测试工具。它对指定的 Rust 项目进行静态分析,以提取使用关系。
功能
- 按层级或模块级检测循环依赖
- 禁止父级访问
- 定义层关系,如
MayNotAccess
、MayOnlyAccess
、MyNotBeAccessedBy
、MayOnlyBeAccessedBy
- 等等,请参阅文档。
安装
您可以选择将其安装为 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