【问题标题】:Checkstyle rule to limit interactions between root packages (with ImportControl?)Checkstyle 规则来限制根包之间的交互(使用 ImportControl?)
【发布时间】:2013-04-15 02:33:08
【问题描述】:

如何创建 Checkstyle 规则来限制不同根包之间的交互?

我有以下 3 个根包:

  • models
  • views
  • controllers

(它们不是类似于com.mycompany.myproject.models。它们是根包。)

我想禁止从modelsviews 以及从viewsmodels(以及其他一些)的访问。

我尝试使用 Checkstyle 中的ImportControl-Checker

  • 尝试 1:使用单个 import-control.xml。问题:我只能提供一个 Root-XML-Element (<import-control pkg="models">),而且它只包含一个包(但我想拥有多个)。
  • 尝试 2:使用多个 import-control.xml。问题:如果我在checkstyle-config.xml 中导入多个,似乎都不起作用(没有错误,看起来我都没有定义)。我在import-control.xml中的定义:

    <module name="ImportControl">
      <property name="id" value="ImportControlViews"/>
      <property name="file" value="${basedir}/project/import-control/views.xml"/>
    </module>
    <module name="ImportControl">
      <property name="id" value="ImportControlModels"/>
      <property name="file" value="${basedir}/project/import-control/models.xml"/>
    </module>
    

【问题讨论】:

    标签: java checkstyle


    【解决方案1】:

    不幸的是,使用开箱即用的 ImportControl 检查很难实现您想要的。
    原因如下:

    您已经发现为什么您的选项 1 不起作用:只能有一个根包。

    选项 2 是可能的,但很费力。让我深入一点。我使用了以下两个导入控制文件,它们不允许使用来自viewsmodels 和来自modelsviews

    <!DOCTYPE import-control PUBLIC "-//Puppy Crawl//DTD Import Control 1.1//EN"
        "http://www.puppycrawl.com/dtds/import_control_1_1.dtd">
    <import-control pkg="views">
        <allow pkg="views" />
        <disallow pkg="models" />
    </import-control>
    
    <!DOCTYPE import-control PUBLIC "-//Puppy Crawl//DTD Import Control 1.1//EN"
        "http://www.puppycrawl.com/dtds/import_control_1_1.dtd">
    <import-control pkg="models">
        <allow pkg="models" />
        <disallow pkg="views" />
    </import-control>
    

    在我的测试设置中,这基本上是可行的,但有一个缺点:每个类都会收到一个 Checkstyle 警告,提示 导入控制文件不处理这个包。这是因为 ImportControl 检查期望所有包都驻留在公共根目录下(通过查看 Checkstyle 5.6 源代码进行验证)。因此,在models 包中,您会从为views 包配置的检查实例中收到警告,反之亦然。
    还有一个额外的问题是 ImportControl 检查仅适用于 import 语句,但找不到代码中直接使用的完全限定引用。

    那么,你能做什么呢?

    • 更改您的应用程序,以便您拥有一个共同的根。这是最佳做法,通常也是个好主意。
    • 将自定义检查作为ImportControlCheck 的子类实现,它添加了一个用于启用/禁用“导入控制文件不处理此包”消息的选项,否则请使用您的选项 2。
    • 如果您使用的是 Eclipse,还有第三种解决方案。您可以使用 Checkstyle Eclipse 插件提供的高级配置对话框来将 ImportControl 实例限制在它们各自的文件中。这也将消除 “导入控制文件不处理此包” 消息。

    【讨论】:

      【解决方案2】:

      您可以通过混合构建工具配置和 checkstyle 配置来实现此目的。例如,使用 gradle,您可以将源放在单独的源集中,并使用

      checkStyleModels {
          excludes = ['views/**']
          configFile file('checkstyle-models.xml')
      }
      checkStyleViews {
          excludes = ['models/**']
          configFile file('checkstyle-views.xml')
      }
      

      然后在 checkstyle-models.xml 中禁止视图。 两个配置都可以有不同的根目录。

      【讨论】:

        猜你喜欢
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多