कोड की एक विशेष लाइन के लिए एक विशेष चेकस्टाइल नियम को कैसे अक्षम करें?


183

मेरे पास अपनी परियोजना में कॉन्फ़िगर किया गया एक चेकस्टाइल सत्यापन नियम है, जो 3 से अधिक इनपुट मापदंडों के साथ वर्ग विधियों को परिभाषित करने के लिए निषिद्ध है। नियम मेरी कक्षाओं के लिए ठीक काम करता है , लेकिन कभी-कभी मुझे तृतीय-पक्ष कक्षाओं का विस्तार करना पड़ता है, जो इस विशेष नियम का पालन नहीं करते हैं।

क्या "चेकस्टाइल" को निर्देश देने की संभावना है कि एक निश्चित विधि को चुपचाप अनदेखा किया जाना चाहिए?

BTW, मैंने चेकस्टाइल के अपने स्वयं के आवरण के साथ समाप्त किया: qulice.com ( जावा कोड गुणवत्ता का सख्त नियंत्रण देखें )

जवाबों:


291

Http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter पर supressionCommentFilter के उपयोग की जाँच करें । आपको अपने चेकस्टाइल.xml में मॉड्यूल जोड़ना होगा

<module name="SuppressionCommentFilter"/>

और यह विन्यास योग्य है। इस प्रकार आप चेक कोड (विभिन्न स्तरों पर) को बंद करने के लिए अपने कोड में टिप्पणियां जोड़ सकते हैं और फिर अपने कोड में टिप्पणियों के उपयोग के माध्यम से फिर से वापस आ सकते हैं। उदाहरण के लिए

//CHECKSTYLE:OFF
public void someMethod(String arg1, String arg2, String arg3, String arg4) {
//CHECKSTYLE:ON

या इससे भी बेहतर, इस अधिक साझा संस्करण का उपयोग करें:

<module name="SuppressionCommentFilter">
    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
    <property name="checkFormat" value="$1"/>
</module>

जो आपको कोड की विशिष्ट लाइनों के लिए विशिष्ट चेक बंद करने की अनुमति देता है:

//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions
catch (Exception e)
//CHECKSTYLE.ON: IllegalCatch

* नोट: आपको भी जोड़ना होगा FileContentsHolder:

<module name="FileContentsHolder"/>

यह सभी देखें

<module name="SuppressionFilter">
    <property name="file" value="docs/suppressions.xml"/>
</module>

SuppressionFilterउसी पृष्ठ पर अनुभाग के तहत , जो आपको पैटर्न मिलान किए गए संसाधनों के लिए व्यक्तिगत चेक बंद करने की अनुमति देता है।

तो, अगर आप अपने चेकस्टाइल.एक्सएमएल में हैं:

<module name="ParameterNumber">
   <property name="id" value="maxParameterNumber"/>
   <property name="max" value="3"/>
   <property name="tokens" value="METHOD_DEF"/>
</module>

आप इसे अपने शमन xml फ़ाइल में बंद कर सकते हैं:

<suppress id="maxParameterNumber" files="YourCode.java"/>

चेकस्टाइल 5.7 में उपलब्ध एक अन्य विधि, @SuppressWarningsजावा एनोटेशन के माध्यम से उल्लंघन को दबाने के लिए है । ऐसा करने के लिए, आपको अपनी कॉन्फ़िगरेशन फ़ाइल में दो नए मॉड्यूल ( SuppressWarningsFilterऔर SuppressWarningsHolder) जोड़ने होंगे :

<module name="Checker">
   ...
   <module name="SuppressWarningsFilter" />
   <module name="TreeWalker">
       ...
       <module name="SuppressWarningsHolder" />
   </module>
</module> 

फिर, अपने कोड के भीतर आप निम्न कार्य कर सकते हैं:

@SuppressWarnings("checkstyle:methodlength")
public void someLongMethod() throws Exception {

या, कई दमन के लिए:

@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})
public void someLongMethod() throws Exception {

NB: " checkstyle:" उपसर्ग वैकल्पिक (लेकिन अनुशंसित) है। डॉक्स के अनुसार पैरामीटर नाम सभी लोअरकेस में होना चाहिए, लेकिन अभ्यास किसी भी मामले में काम करने का संकेत देता है।


7
TreeWalter पर FileContentsHolder जोड़ना याद रखें। देखें stackoverflow.com/a/5764666/480483
djjeck

2
यदि आप उपयोग करते हैं //CHECKSTYLE.OFF: और फिर इसे फिर से चालू करना भूल जाते हैं, तो क्या यह केवल फ़ाइल वाली फ़ाइल //CHECKSTYLE.OFF: या सभी बाद में संसाधित फ़ाइलों में भी बंद रहेगा ?
रोलैंड

1
@ रोलैंड, यह केवल उस परीक्षण वर्ग की अवधि के लिए बंद रहता है।
क्रिस नाइट

1
"पैरामीटर नाम सभी लोअरकेस में होना चाहिए।" @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance")मेरे लिए सिर्फ लो-केस समकक्ष के रूप में काम किया।
एंडर्स रबो थोरबेक

2
चेकस्टाइल 8.1 के बाद से SuppressionCommentFilter के तहत होना चाहिए TreeWalker, और FileContentHolderअब (आवश्यक) उपलब्ध नहीं है।
avandeursen

70

यदि आप चयनात्मक रूप से मौन नियमों का उपयोग करना पसंद करते हैं, तो अब यह संभव है @SuppressWarningsएनोटेशन का उपयोग करना , चेकस्टाइल 5.7 से शुरू करना (और चेकस्टाइल मेवेन प्लगिन 2.12+ द्वारा समर्थित)।

सबसे पहले, आप में checkstyle.xml, SuppressWarningsHolderमॉड्यूल को इसमें जोड़ें TreeWalker:

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

अगला, SuppressWarningsFilterवहां सक्षम करें (भाई के रूप में TreeWalker):

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />

<module name="TreeWalker">
...

अब आप एनोटेट कर सकते हैं जैसे कि वह विधि जिसे आप एक निश्चित चेकस्टाइल नियम से बाहर करना चाहते हैं:

@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
    // very long auto-generated equals() method
}

checkstyle:करने के लिए बहस में उपसर्ग @SuppressWarningsयाद दिलाते जहां इस चेतावनी से आया के रूप में यह की तरह वैकल्पिक है, लेकिन मैं। नियम का नाम लोअरकेस होना चाहिए।

अंत में, यदि आप ग्रहण का उपयोग कर रहे हैं, तो यह तर्क के बारे में शिकायत करेगा कि यह अज्ञात है:

असमर्थित @SuppressWarnings ("चेकस्टाइल: मेथडलग्रेन")

यदि आप चाहें तो आप इस ग्रहण चेतावनी को प्राथमिकता में अक्षम कर सकते हैं:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'

2
मैं इसे जांचे गए उत्तर के रूप में नामित करता हूं, क्योंकि मुझे लगता है कि यह एक ऐसा समाधान है जिसे ज्यादातर मामलों में सबसे अच्छा काम करना चाहिए।
एवांडेर्सन

33

जो भी अच्छी तरह से काम करता है वह SuppressWithNearbyCommentFilter है जो ऑडिट घटनाओं को दबाने के लिए व्यक्तिगत टिप्पणियों का उपयोग करता है।

उदाहरण के लिए

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

एक फिल्टर को कॉन्फ़िगर करने के लिए ताकि अगले संस्करण के लिए चेक इग्नोर चेक करें अगला लाइन के लिए दिए गए चेक के लिए किसी भी ऑडिट को ट्रिगर करने से बचा जाता है और अगले var लाइनों (कुल var + 1 लाइनों के लिए):

<module name="SuppressWithNearbyCommentFilter">
    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>
    <property name="checkFormat" value="$1"/>
    <property name="influenceFormat" value="$2"/>
</module>

http://checkstyle.sourceforge.net/config.html


मैं regex को बदल CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES?दूंगा जिससे अनदेखा कमांड अधिक पठनीय बन जाएगा। (आप "अगला 1 लाइन के लिए जाँच करें" और "चेक 3 लाइन के लिए जाँच करें" का उपयोग करने में सक्षम हो जाएगा)।
मटका 312

@ Matt3o12 CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINEमेरे लिए भी काम करता है (यह दोनों से मेल खाता है lineऔर lines)।
स्लावा सेमुशिन

3

SuppressWarningsFilter को संदर्भित करने वाला प्रत्येक उत्तर एक महत्वपूर्ण विवरण याद कर रहा है। यदि आप अपने चेकस्टाइल- config.xml में इस तरह के रूप में परिभाषित किया गया है, तो आप केवल सभी लोअरकेस आईडी का उपयोग कर सकते हैं। यदि नहीं, तो आपको मूल मॉड्यूल नाम का उपयोग करना चाहिए।

उदाहरण के लिए, अगर मेरे चेकस्टाइल- config.xml में है:

<module name="NoWhitespaceBefore"/>

मैं उपयोग नहीं कर सकता:

@SuppressWarnings({"nowhitespacebefore"})

हालाँकि, मुझे उपयोग करना चाहिए:

@SuppressWarnings({"NoWhitespaceBefore"})

काम करने के लिए पहले सिंटैक्स के लिए, चेकस्टाइल- config.xml होना चाहिए:

<module name="NoWhitespaceBefore">
  <property name="id" value="nowhitespacebefore"/>
</module>

यह मेरे लिए काम किया है, कम से कम CheckStyle संस्करण 6.17 में।


1

मुझे ऊपर दिए गए उत्तरों से कठिनाई हुई, संभावित रूप से क्योंकि मैंने त्रुटियों के लिए चेक स्टाइल चेतावनी दी थी। क्या काम किया गया था SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

इसका दोष यह है कि लाइन रेंज एक अलग suppresssions.xml फ़ाइल में संग्रहीत है, इसलिए एक अपरिचित डेवलपर तुरंत कनेक्शन नहीं बना सकता है।


धन्यवाद, यह केवल एक चीज थी जो मेरे लिए भी काम करती थी
जोनाथन्रज

1
<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

BEGIN जेनरेटेड CODE वाली टिप्पणी और पंक्ति END GENERATED CODE युक्त टिप्पणी के बीच ऑडिट ईवेंट को दबाने के लिए एक फ़िल्टर को कॉन्फ़िगर करना:

<module name="SuppressionCommentFilter">
  <property name="offCommentFormat" value="BEGIN GENERATED CODE"/>
  <property name="onCommentFormat" value="END GENERATED CODE"/>
</module>

//BEGIN GENERATED CODE
@Override
public boolean equals(Object obj) { ... } // No violation events will be reported

@Override
public int hashCode() { ... } // No violation events will be reported
//END GENERATED CODE

और देखें


0

आप https://checkstyle.sourceforge.io/config_filters.html#SuppressionXpathFilter बाहर की कोशिश कर सकते हैं

-जी विकल्प के साथ सीएलआई का उपयोग करते हुए Xpath शमन उत्पन्न करें। फिर, जिस लाइन को आप दबाना चाहते हैं, उसके लिए दमन तत्व को चुनें। एक दमन फ़ाइल में सहेजें और ऊपर SuppressionXpathFilter तत्व में उस फ़ाइल पथ को निर्दिष्ट करें।

https://checkstyle.sourceforge.io/cmdline.html#Command_line_usage

यदि आप चींटी का उपयोग कर रहे हैं, तो आप इस पोस्ट को एक ज़बरदस्त काम के रूप में संदर्भित कर सकते हैं जिसका उपयोग दमन Xpath फ़ाइल बनाने के लिए किया जाएगा।

https://github.com/checkstyle/checkstyle/issues/6934#issuecomment-522289083

फ़िल्टर का उपयोग करने के तरीके के बारे में इस धागे को देखें:

https://groups.google.com/forum/m/#!topic/checkstyle/F_f6R_Qk1EM

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.