контрольный стиль + фильтры подавления
-
10-07-2019 - |
Вопрос
У меня есть настройка фильтра подавления checkstyle (напримеригнорируйте магические числа в коде модульного теста).
XML-файл подавления находится в той же папке, что и XML-файл checkstyle.Однако место, где на самом деле находится этот файл, варьируется:в моем окне разработки Windows он находится в d:\dev\shared\checkstyle\config на сервере Linux CI он будет находиться в /root/repo/shared/checkstyle /config в другом окне разработчиков это может быть где угодно (они проверяют свое svn-репозиторий на).
Единственная "согласованная" вещь заключается в том, что файл подавления всегда находится в той же папке, что и XML-файл checkstyle.Я не могу понять, как обеспечить постоянный доступ к этому файлу.Также я не знаю, почему checkstyle не поддерживает встроенное подавление в XML-файле checkstyle.
какая-нибудь помощь?
Решение
У меня была такая же проблема с конфигурацией подавления Checkstyle, когда я переходил между Linux и Windows. Вот как я решил эту проблему в моей системе сборки на основе Ant:
По сути, я вставляю правильное, специфичное для платформы значение каталога в основной файл конфигурации Checkstyle, настраивая файл свойств Checkstyle с помощью скрипта сборки Ant.
Мой основной файл конфигурации 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 не может содержать обратную косую черту, то есть символы разделителя пути Windows, в значении Свойство file
модуля SuppressionFilter
. Например, указание чего-то вроде C: \ foo \ bar \ baz
приводит к сообщению об ошибке Checkstyle о том, что C: foobarbaz
не может быть найдено. Я работаю над этим путем "преобразования" свойство построения каталога scm.dir
для " unix " отформатировать с помощью Ant pathconvert
:
<pathconvert targetos="unix" property="scm.dir.unix">
<path location="${scm.dir}"/>
</pathconvert>
Затем я вызываю Ant-задачу checkstyle
следующим образом:
<checkstyle config="${scm.dir}/checkstyle_checks.xml"
properties="${scm.dir}/checkstyle.properties">
<!-- details elided -->
</checkstyle>
Вызов задачи checkstyle
внедряет пары ключ / значение, содержащиеся в файле checkstyle.properties
, в основную конфигурацию Checkstyle.
Если хотите, вы можете увидеть полные сценарии здесь . р>
Надеюсь, это поможет
Другие советы
В eclipse я добавил следующее, что не требовало от меня добавления каких-либо дополнительных свойств:
<module name="SuppressionFilter">
<property name="file" value="${samedir}/suppressions.xml"/>
</module>
Я получаю абсолютный путь к каталогу, в котором находится 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, похоже, не требуется преобразование разделителя пути.
Если вы работаете с eclipse и у вас есть файл подавления в том же каталоге, что и внешняя конфигурация checkstyle, вы можете настроить фильтр подавления следующим образом:
<module name="SuppressionFilter">
<property name="file" value="${config_dir}/my_suppressions.xml"/>
</module>
Вы также должны определить свойство $ {config_dir} в конфигурации checkstyle:
Настройки Eclipse - > & Quot; Checkstyle & Quot; - & GT; Выберите свой конфиг cs - > " Свойства .. " - & GT; " Дополнительные свойства .. "
Определите свойство для каталога конфигурации checkstyle:
config_dir ---> ${config_loc}
Я думаю, что ответ Роберта можно расширить на простое решение для муравья и Eclipse :
Включите файл подавления в XML-файл конфигурации следующим образом:
<module name="SuppressionFilter">
<property name="file" value="${samedir}/suppressions.xml"/>
</module>
Теперь Eclipse удовлетворен и находит файл.
Чтобы заставить муравья работать, обновите вашу цель примерно так:
<checkstyle config="${checkstyle.config}/checkstyle-checks.xml">
<!-- ... -->
<property key="samedir" value="${checkstyle.config}"/>
</checkstyle>
Надеюсь, это поможет.
Начиная с CheckStyle 4.26.0, вы можете использовать предопределенные константы в своих конфигурационных файлах.
(https://github.com/jshiell/checkstyle-idea/issues/217) :
- ${basedir} & ${project_loc} - сопоставляется с текущим каталогом проекта
- ${workspace_loc} - сопоставляется с текущим каталогом рабочей области Eclipse
- ${config_loc} & ${samedir} - получить сопоставление с каталогом, в котором находится файл конфигурации
Если вы хотите поделиться конфигурацией с maven, вам нужно будет "присвоить псевдоним" "константам eclipse" в вашей конфигурации POM (в разделе отчетов), используя элемент конфигурации "propertyExpansion" :
<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>
"Расширение собственности" вдохновлено : https://github.com/checkstyle/checkstyle/blob/master/pom.xml#L582.