6

我有一个 checkstyle 抑制过滤器设置(例如忽略单元测试代码中的幻数)。

抑制 xml 文件与 checkstyle xml 文件位于同一文件夹中。但是,这个文件实际上是不同的:在我的 Windows 开发框中,它位于 Linux CI 服务器上的 d:\dev\shared\checkstyle\config 中,它将位于另一个开发者框的 /root/repo/shared/checkstyle/config 中它可能在任何地方(他们查看他们的 svn 存储库)。

唯一“一致”的是抑制文件始终与 checkstyle xml 文件位于同一文件夹中。我无法弄清楚如何确保始终一致地拾取该文件。另外我不知道为什么 checkstyle 不支持 checkstyle xml 文件中的嵌入式抑制。

有什么帮助吗?

4

6 回答 6

11

当我在 Linux 和 Windows 之间来回切换时,我在 Checkstyle 抑制配置中遇到了同样的问题。以下是我在基于 Ant 的构建系统中解决它的方法:

基本上,我通过使用 Ant 构建脚本配置 Checkstyle 属性文件,将适当的、特定于平台的目录值注入到主 Checkstyle 配置文件中。

我的主要 Checkstyle 配置文件有一个SuppressionFilter模块声明,如下所示。该checkstyle-suppressions-file属性的值来自 Checkstyle 属性文件:

<module name="SuppressionFilter">
    <property name="file" value="${checkstyle-suppressions-file}"/>
</module>

Checkstyle 属性文件不是静态的,它是由 Ant 构建脚本从名为template-checkstyle.properties. 以下是抑制文件属性的模板:

checkstyle-suppressions-file=@SCM_DIR@/checkstyle_suppressions.xml

我的 Ant 构建脚本将此文件复制到名为checkstyle.properties. 该副本将特殊标记替换为找到抑制文件的目录的正确值:

<copy file="${scm.dir}/template-checkstyle.properties" tofile="${scm.dir}/checkstyle.properties">
    <filterset>
        <filter token="SCM_DIR" value="${scm.dir.unix}"/>
    </filterset>
</copy>

现在,价值scm.dir.unix从何而来?好吧,它来自我构建的一个属性,请继续阅读。您需要使用您提到的目录值指定这样的值。

请注意,关于您指定此目录的方式,有一个不太明显的问题。我说该scm.dir.unix值是从构建属性派生的,因为我观察到主 Checkstyle 配置文件不能在模块的file属性值中包含反斜杠,即 Windows 路径分隔符。SuppressionFilter例如,指定类似C:\foo\bar\baz的内容会导致 Checkstyle 错误消息说C:foobarbaz找不到。我通过使用 Ant 的任务将scm.dir目录构建属性“转换”为“unix”格式来解决这个问题:pathconvert

<pathconvert targetos="unix" property="scm.dir.unix">
    <path location="${scm.dir}"/>
</pathconvert>

然后我这样调用checkstyleAnt 任务:

<checkstyle config="${scm.dir}/checkstyle_checks.xml"
            properties="${scm.dir}/checkstyle.properties">
    <!-- details elided -->
</checkstyle>

对任务的调用将文件checkstyle中包含的键/值对checkstyle.properties注入到主 Checkstyle 配置中。

如果你喜欢,你可以在这里看到完整的脚本

希望这可以帮助

于 2008-10-13T22:39:23.573 回答
6

在 Eclipse 中,我放置了以下内容,不需要我添加任何其他属性:

<module name="SuppressionFilter">
    <property name="file" value="${samedir}/suppressions.xml"/>
</module>
于 2013-02-21T19:26:31.643 回答
2

build.xml我使用ant.file变量和项目名称获取所在目录的绝对路径:

<project name="common" ... >
  <dirname property="thisdir" file="${ant.file.common}"/>

然后我可以连接到我的 checkstyle 配置文件的绝对路径:

checkstyle.suppressions.file=${thisdir}/qclib/checkstyle-suppressions.xml

由于thisdir变量来自ant,所以似乎不需要路径分隔符转换。

于 2009-06-03T14:25:22.767 回答
2

如果您正在使用 eclipse 并且您的抑制文件与外部 checkstyle 配置位于同一目录中,则可以像这样设置抑制过滤器:

<module name="SuppressionFilter">
    <property name="file" value="${config_dir}/my_suppressions.xml"/>
</module>

您还必须在 checkstyle 配置中定义 ${config_dir} 属性:

Eclipse Preferences -> “Checkstyle” -> 选择你的 cs 配置 -> “Properties ..” -> “Additional Properties ..”

为 checkstyle 配置目录定义一个属性:

config_dir --->  ${config_loc}
于 2011-11-05T12:17:59.447 回答
1

我认为罗伯特的答案可以扩展到ant 和 Eclipse的简单解决方案:

在配置 XML 中包含抑制文件,如下所示:

<module name="SuppressionFilter">
    <property name="file" value="${samedir}/suppressions.xml"/>
</module>

现在,Eclipse 满意并找到了该文件。

要让 ant 工作,请将您的目标更新为以下内容:

<checkstyle config="${checkstyle.config}/checkstyle-checks.xml">
    <!-- ... -->
    <property key="samedir" value="${checkstyle.config}"/>
</checkstyle>

希望这可以帮助。

于 2013-03-05T14:50:32.047 回答
0

从 CheckStyle 4.26.0 开始,您可以在配置文件中使用预定义的常量。

https://github.com/jshiell/checkstyle-idea/issues/217):

  • ${basedir} & ${project_loc} - 映射到当前项目目录
  • ${workspace_loc} - 映射到当前的 Eclipse 工作区目录
  • ${config_loc} & ${samedir} - 映射到配置文件所在的目录

如果您想与 maven 共享配置,您需要使用“propertyExpansion”配置元素在您的 POM 配置(在报告部分)中“别名”“eclipse 常量”:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-checkstyle-plugin</artifactId>
   <version>3.0.0</version>
   <configuration>
      <configLocation>${project.basedir}/quality/checkstyle/dap_checkstyle_checks.xml</configLocation>
      <propertyExpansion>basedir=${project.basedir}</propertyExpansion>
   </configuration>
   <reportSets>
      <reportSet>
         <reports>
            <report>checkstyle</report>
         </reports>
      </reportSet>
   </reportSets>
</plugin>

“propertyExpansion”的灵感来自:https ://github.com/checkstyle/checkstyle/blob/master/pom.xml#L582 。

于 2018-08-10T23:23:47.120 回答