我有一个checkstyle抑制滤镜设置(例如,忽略单位测试代码中的幻数)。
suppress xml文件与checkstyle xml文件位于同一文件夹中。但是,此文件实际上有所不同: 在我的Windows开发框中,它位于d:\ dev \ shared \ checkstyle \ config中 在Linux CI服务器上,它将位于/ root / repo / shared / checkstyle / config中 在另一个开发人员的盒子里,它可以在任何地方(他们检查他们的svn回购)。
唯一“一致”的事情是抑制文件始终与checkstyle xml文件位于同一文件夹中。 我无法弄清楚如何确保始终一致地拾取此文件。另外我不知道为什么checkstyle不支持checkstyle xml文件中的嵌入式抑制。
任何帮助?
答案 0 :(得分:10)
当我在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属性文件不是静态的,它是由名为template-checkstyle.properties
的属性文件模板中的Ant构建脚本生成的。以下是抑制文件属性的模板外观:
checkstyle-suppressions-file=@SCM_DIR@/checkstyle_suppressions.xml
My 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配置文件不能包含反斜杠,即Windows路径分隔符,在{file
属性的值SuppressionFilter
1}}模块。例如,指定C:\foo\bar\baz
之类的内容会导致出现Checkstyle错误消息,指出无法找到C:foobarbaz
。我通过使用Ant scm.dir
任务将pathconvert
目录构建属性“转换”为“unix”格式来解决这个问题:
<pathconvert targetos="unix" property="scm.dir.unix">
<path location="${scm.dir}"/>
</pathconvert>
然后我像这样调用checkstyle
Ant任务:
<checkstyle config="${scm.dir}/checkstyle_checks.xml"
properties="${scm.dir}/checkstyle.properties">
<!-- details elided -->
</checkstyle>
对checkstyle
任务的调用会将checkstyle.properties
文件中包含的键/值对注入主Checkstyle配置。
如果您愿意,可以看到完整的脚本here
希望这有帮助
答案 1 :(得分:6)
在eclipse中,我提出以下内容,不需要我添加任何其他属性:
<module name="SuppressionFilter">
<property name="file" value="${samedir}/suppressions.xml"/>
</module>
答案 2 :(得分: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,因此似乎不需要路径分隔符转换。
答案 3 :(得分:2)
如果您正在使用eclipse,并且您将抑制文件与外部checkstyle配置放在同一目录中,则可以设置如下的抑制过滤器:
<module name="SuppressionFilter">
<property name="file" value="${config_dir}/my_suppressions.xml"/>
</module>
您还必须在checkstyle配置中定义$ {config_dir}属性:
Eclipse首选项 - &gt; “Checkstyle” - &gt;选择你的cs配置 - &gt; “属性......” - &gt; “其他属性......”
为checkstyle配置目录定义属性:
config_dir ---> ${config_loc}
答案 4 :(得分: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>
希望这有帮助。
答案 5 :(得分: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常量”:
ID name state mid
12345 JOHN AZ ee/ff (ONLY ONE)
45678 henry AL ll/mm (ONLY ONE)
“ propertyExpansion”的灵感来自https://github.com/checkstyle/checkstyle/blob/master/pom.xml#L582。