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 ArchCondition
s or DescribedPredicate
s表达。
对于在 fluent API 中表示为方法调用的约束,您通常可以找到具有相同名称的等效预定义 DescribedPredicate
,例如dependOnClassesThat().resideInAPackage(pkg)
≡ dependOnClassesThat(resideInAPackage(pkg))
。您的 IDE 应该可以帮助您找到 the right static import。从那里开始,通常很容易编写更复杂的约束,甚至不必实现自定义 ArchCondition
s 或 DescribedPredicate
s.
对于你的情况,我猜你正在寻找这样的东西:
noClasses()
.that().resideInAPackage("package2..")
.should().dependOnClassesThat(
resideInAnyPackage("package1..").and(
not(resideInAnyPackage("package1.common.."))
)
)
我遇到了看似微不足道的用例,但我仍然无法弄清楚。我们来看看包结构。
-- 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 ArchCondition
s or DescribedPredicate
s表达。
对于在 fluent API 中表示为方法调用的约束,您通常可以找到具有相同名称的等效预定义 DescribedPredicate
,例如dependOnClassesThat().resideInAPackage(pkg)
≡ dependOnClassesThat(resideInAPackage(pkg))
。您的 IDE 应该可以帮助您找到 the right static import。从那里开始,通常很容易编写更复杂的约束,甚至不必实现自定义 ArchCondition
s 或 DescribedPredicate
s.
对于你的情况,我猜你正在寻找这样的东西:
noClasses()
.that().resideInAPackage("package2..")
.should().dependOnClassesThat(
resideInAnyPackage("package1..").and(
not(resideInAnyPackage("package1.common.."))
)
)