checkstyle + filtri di soppressione
-
10-07-2019 - |
Domanda
Ho un'impostazione del filtro di soppressione dello stile di controllo (ad esempio ignora i numeri magici nel codice di test unitario).
Il file XML di soppressione si trova nella stessa cartella del file XML di stile di controllo. Tuttavia, dove questo file è effettivamente varia: sulla mia finestra di sviluppo di Windows è in d: \ dev \ shared \ checkstyle \ config sul server CI Linux sarà in / root / repo / shared / checkstyle / config su un altro box di sviluppatori potrebbe essere ovunque (controllano il loro repository svn su).
L'unica " coerente " cosa è che il file di soppressione si trova sempre nella stessa cartella del file xml checkstyle. Non riesco a capire come garantire che questo file sia sempre raccolto in modo coerente. Inoltre non so perché checkstyle non supporti la soppressione incorporata all'interno del file xml di checkstyle.
qualche aiuto?
Soluzione
Ho avuto lo stesso problema con la configurazione di soppressione di Checkstyle mentre andavo avanti e indietro tra Linux e Windows. Ecco come l'ho risolto nel mio sistema di build basato su Ant:
Fondamentalmente, inserisco il valore di directory specifico specifico della piattaforma nel file di configurazione principale di Checkstyle configurando un file delle proprietà di Checkstyle con uno script di build Ant.
Il mio file di configurazione principale di Checkstyle ha una dichiarazione del modulo SuppressionFilter
come mostrato di seguito. Il valore della proprietà checkstyle-suppressions-file
proviene da un file delle proprietà di Checkstyle:
<module name="SuppressionFilter">
<property name="file" value="${checkstyle-suppressions-file}"/>
</module>
Il file delle proprietà Checkstyle non è statico, è generato da uno script di build Ant da un modello di file delle proprietà chiamato template-checkstyle.properties
. Ecco come appare il modello per la proprietà del file di soppressione:
checkstyle-suppressions-file=@SCM_DIR@/checkstyle_suppressions.xml
My Ant build script copia questo file in un file chiamato checkstyle.properties
. La copia ha il token speciale sostituito con il valore corretto della directory in cui si trova il file di soppressione:
<copy file="${scm.dir}/template-checkstyle.properties" tofile="${scm.dir}/checkstyle.properties">
<filterset>
<filter token="SCM_DIR" value="${scm.dir.unix}"/>
</filterset>
</copy>
Ora, da dove viene il valore di scm.dir.unix
? Bene, è derivato da una proprietà della mia build, continua a leggere. Dovrai specificare tale valore con i valori della directory che hai citato.
Si noti che esiste un problema leggermente non ovvio relativo al modo in cui si specifica questa directory. Dico che il valore scm.dir.unix
è derivato da una proprietà build perché ho osservato che il file di configurazione Checkstyle principale non può contenere barre rovesciate, ovvero caratteri di separazione del percorso di Windows, nel valore di file
del modulo SuppressionFilter
. Ad esempio, specificare qualcosa come C: \ foo \ bar \ baz
porta a un messaggio di errore Checkstyle che dice che C: foobarbaz
non è stato trovato. Mi aggiro attorno a " convertendo " la proprietà di costruzione della directory scm.dir
su un " unix " formato con l'attività pathconvert
di Ant:
<pathconvert targetos="unix" property="scm.dir.unix">
<path location="${scm.dir}"/>
</pathconvert>
Quindi chiamo il checkstyle
task Ant come questo:
<checkstyle config="${scm.dir}/checkstyle_checks.xml"
properties="${scm.dir}/checkstyle.properties">
<!-- details elided -->
</checkstyle>
La chiamata all'attività checkstyle
inietta le coppie chiave / valore contenute nel file checkstyle.properties
nella configurazione principale di Checkstyle.
Se vuoi, puoi vedere gli script completi qui
Spero che questo aiuti
Altri suggerimenti
In eclipse ho inserito quanto segue che non mi richiedeva l'aggiunta di ulteriori proprietà:
<module name="SuppressionFilter">
<property name="file" value="${samedir}/suppressions.xml"/>
</module>
Ottengo il percorso assoluto della directory in cui build.xml
risiede usando la variabile ant.file
e il nome del progetto:
<project name="common" ... >
<dirname property="thisdir" file="${ant.file.common}"/>
Quindi posso concatenare un percorso assoluto per i miei file di configurazione di checkstyle:
checkstyle.suppressions.file=${thisdir}/qclib/checkstyle-suppressions.xml
Poiché la variabile thisdir
proviene da ant, non sembra aver bisogno della conversione del separatore di percorso.
Se stai lavorando con eclipse e hai il file di soppressione nella stessa directory della configurazione esterna dello stile di controllo, puoi impostare un filtro di soppressione come questo:
<module name="SuppressionFilter">
<property name="file" value="${config_dir}/my_suppressions.xml"/>
</module>
Devi anche definire la proprietà $ {config_dir} nella configurazione dello stile di controllo:
Preferenze di Eclipse - > & Quot; Checkstyle " - > Scegli la tua configurazione cs - > " Proprietà .. " - > " Proprietà aggiuntive .. "
Definire una proprietà per la directory di configurazione checkstyle:
config_dir ---> ${config_loc}
Penso che la risposta di Robert possa essere estesa a una soluzione semplice per formica ed Eclipse :
Includi il file di soppressione nel tuo XML di configurazione in questo modo:
<module name="SuppressionFilter">
<property name="file" value="${samedir}/suppressions.xml"/>
</module>
Ora Eclipse è soddisfatto e trova il file.
Per far funzionare la formica aggiorna il tuo bersaglio a qualcosa del genere:
<checkstyle config="${checkstyle.config}/checkstyle-checks.xml">
<!-- ... -->
<property key="samedir" value="${checkstyle.config}"/>
</checkstyle>
Spero che questo aiuti.
Da CheckStyle 4.26.0 è possibile utilizzare costanti predefinite nei file di configurazione.
( https://github.com/jshiell/checkstyle-idea/issues/ 217 ):
- $ {basedir} & amp; $ {project_loc}: viene mappato nella directory del progetto corrente
- $ {workspace_loc}: viene mappato alla directory corrente dell'area di lavoro Eclipse
- $ {config_loc} & amp; $ {samedir} - viene mappato nella directory in cui si trova il file di configurazione
Se desideri condividere la configurazione con Maven dovrai "quotare alias" le costanti "eclissi" nella tua configurazione POM (nella sezione dei rapporti) usando " propertyExpansion " elemento di configurazione:
<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>
Il " propertyExpansion " è ispirato a: https://github.com/checkstyle/checkstyle/ blob / master / pom.xml # L582 .