ArchUnit 包使用,子包除外

ArchUnit packages usage with exceptions for subpackages

我遇到了看似微不足道的用例,但我仍然无法弄清楚。我们来看看包结构。

-- CommonPackage
-- Package1
---- DAOs
---- Common
---- Service
-- Package2
---- subpackage1
---- subpackage2

我想要实现的是创建一个规则,其中 Package2 中的所有 类,不能使用任何来自Package1 除了 common 一个。到目前为止,我已经有了这样的东西:

noClasses()
    .that()
    .resideInAPackage("package2..")            
    .should()
    .resideInAnyPackage("package1..")
    // and how write eg. except("package1.common")
    .check(classes);

但我不知道如何从这个等式中排除 package1.common。有人可以帮忙吗?

我假设您忘记在问题中包含 .dependOnClassesThat()
(类 在 package2 只是不在 package1... )

如果你的约束不能用the fluent API, consider using more powerful APIs based on arbitrary ArchConditions or DescribedPredicates表达。 对于在 fluent API 中表示为方法调用的约束,您通常可以找到具有相同名称的等效预定义 DescribedPredicate,例如dependOnClassesThat().resideInAPackage(pkg)dependOnClassesThat(resideInAPackage(pkg))。您的 IDE 应该可以帮助您找到 the right static import。从那里开始,通常很容易编写更复杂的约束,甚至不必实现自定义 ArchConditions 或 DescribedPredicates.

对于你的情况,我猜你正在寻找这样的东西:

noClasses()
    .that().resideInAPackage("package2..")
    .should().dependOnClassesThat(
        resideInAnyPackage("package1..").and(
            not(resideInAnyPackage("package1.common.."))
        )
    )