2008-10-13 15 views
5

Ho una configurazione del filtro di soppressione dello stile di controllo (ad esempio, ignora i numeri magici nel codice di test dell'unità).checkstyle + filtri di soppressione

Il file xml di soppressione si trova nella stessa cartella del file xml di stile. Tuttavia, dove questo file è effettivamente varia: sulla mia finestra di sviluppo di windows è in d: \ dev \ shared \ checkstyle \ config sul server CI Linux che sarà in/root/repo/shared/checkstyle/config su un'altra scatola di sviluppatori potrebbe essere ovunque (controllano il loro svn repo a).

L'unica cosa "consistente" è che il file di soppressione si trova sempre nella stessa cartella del file xml di stile. Non riesco a capire come garantire che questo file sia sempre prelevato in modo coerente. Inoltre non so perché checkstyle non supporta la soppressione incorporata all'interno del file xml checkstyle.

aiuto?

risposta

10

Ho avuto lo stesso problema con la configurazione di soppressione Checkstyle quando stavo andando 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 della piattaforma nel file di configurazione di Checkstyle principale configurando un file di proprietà di Checkstyle con uno script di build Ant.

Il mio file di configurazione Checkstyle principale ha una dichiarazione del modulo SuppressionFilter come mostrato di seguito. Il valore della proprietà checkstyle-suppressions-file viene da una proprietà Checkstyle File:

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

Il file delle proprietà Checkstyle non è statico, esso è generato da uno script di Ant da un file di proprietà modello chiamato template-checkstyle.properties. Ecco cosa il modello appare come per la proprietà del file soppressioni:

[email protected][email protected]/checkstyle_suppressions.xml 

miei Ant script copia costruire 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 soppressioni:

<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 viene? Bene, è derivato da una proprietà della mia build, continua a leggere. Dovrai specificare tale valore con i valori di directory che hai menzionato.

Si noti che c'è un problema leggermente non ovvio riguardo al modo in cui si specifica questa directory. Dico che il valore scm.dir.unix deriva da una proprietà build perché ho osservato che il file di configurazione Checkstyle principale non può contenere barre rovesciate, ad esempio caratteri separatori del percorso Windows, nel valore della proprietà del modulo SuppressionFilter. Ad esempio, specificare qualcosa come C:\foo\bar\baz porta a un messaggio di errore Checkstyle che dice che non è possibile trovare C:foobarbaz.Io lavoro intorno a questo "convertendo" la proprietà di build scm.dir directory in un formato "unix" con pathconvert compito di Ant:

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

Poi chiamo il compito Ant checkstyle come questo:

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

La chiamata l'attività checkstyle inietta le coppie chiave/valore contenute nel file checkstyle.properties nella configurazione principale di Checkstyle.

Se si desidera, è possibile visualizzare gli script completo here

Spero che questo aiuti

+0

Grazie per i suggerimenti, il mio formicaio ora sta bene, ignorando i numeri magici nelle classi Test (è un inizio!). Ho dovuto apportare una modifica al codice fornito (per riferimento a chiunque altro possa venire in seguito), l'attività manca un "filtering = true"; almeno quando corro con la mia versione di formica. –

2

ottengo il percorso assoluto della directory in cui build.xml risiede utilizzando la variabile ant.file e il nome del progetto:

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

Allora posso concatenare un percorso assoluto per i miei file di configurazione Checkstyle:

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

Poiché la variabile thisdir deriva da formica, non sembra che sia necessaria la conversione del separatore di percorso.

2

se si sta lavorando con Eclipse e si dispone il file di soppressione nella stessa directory del config checkstyle esterno, è possibile impostare un filtro di soppressione come questo:

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

È inoltre necessario definire il $ { config_dir} proprietà nella configurazione checkstyle:

Preferenze

Eclipse -> "Checkstyle" -> Scegli il tuo config cs -> "proprietà .." -> "proprietà aggiuntive .."

definire una proprietà per il checkstyle dir di config:

config_dir ---> ${config_loc} 
6

in Eclipse ho messo il seguito della quale non mi richiede di aggiungere eventuali ulteriori proprietà:

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

Credo che la risposta di Robert può essere estesa ad una soluzione facile per formica e Eclipse:

Includere il file di soppressione all'interno del vostro 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 arrivare formica al lavoro aggiornare il tuo obiettivo per qualcosa di simile:

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

Spero che questo aiuti.