【Web系列二十八】代码规范校验

写在前面

        优秀的开发者一定是对代码整洁和规范有要求的,但开发时难免会有疏漏的地方,因此代码规范校验工具是必不可少的。本文将介绍不同的Web开发平台的代码规范校验工具和示例。

Django-Python

环境

pip install pylint-django

        执行以下语句生成配置文件

pylint --persistent=n --generate-rcfile > .pylintrc

  模板

[MASTER]

# 弃用pylint-django插件
load-plugins=pylint_django	

# 忽略部分文件	
ignore=


[MAIN]	

# Analyse import fallback blocks. This can be used to support both Python 2 and	
# 3 compatible code, which means that the block might have code that exists	
# only in one or another interpreter, leading to false positives when analysed.	
analyse-fallback-blocks=no	

# Clear in-memory caches upon conclusion of linting. Useful if running pylint	
# in a server-like mode.	
clear-cache-post-run=no	

# Load and enable all available extensions. Use --list-extensions to see a list	
# all available extensions.	
#enable-all-extensions-	

# In error mode, messages with a category besides ERROR or FATAL are	
# suppressed, and no reports are done by default. Error mode is compatible with	
# disabling specific errors.	
#errors-only=	

# Always return a 0 (non-error) status code, even if lint errors are found.	
# This is primarily useful in continuous integration scripts.	
#exit-zero=	

# A comma-separated list of package or module names from where C extensions may	
# be loaded.Extensions are loading into the active Python interpreter and may	
# run arbitrary code.	
extension-pkg-allow-list=	

# A comma-separated list of package or module names from where C extensions may	
# be loaded. Extensions are loading into the active Python interpreter and may	
# run arbitrary code. (This is an alternative name to extension-pkg-allow-list	
# for backward compatibility.)	
extension-pkg-whitelist=	

# Return non-zero exit code if any of these messages/categories are detected,	
# even if score is above --fail-under value. Syntax same as enable. Messages	
# specified are enabled, while categories only check already-enabled messages.	
fail-on=	

# specify a score threshold under which the program will exit with error.	
fail-under=10

# Interpret the stdin as a python script, whose filename needs to be passed	
# the module_or_package argument.	

#from-stdin=
# Files or directories to be skipped. They should be base names, not paths.	
ignore=CVS	

# Add files or directories matching the regular expressions patterns to the	
# ignore-list, The regex matches against paths and can be in Posix or Windows	
# format. Because '\\' represents the directory delimiter on Windows systems,	
# it can't be used as an escape character.	
ignore-paths=	

# Files or directories matching the regular expression patterns are skipped.	
# The regex matches against base names, not paths. The default value ignores	
# Emacs file locks	
ignore-patterns=^\.#	

# List of module names for which member attributes should not be checked	
# (useful for modules/projects where namespaces are manipulated during runtime	
# and thus existing member attributes cannot be deduced by static analysis).It	
# supports qualified module names, as well as Unix pattern matching.	
ignored-modules=	

# Python code to execute, usually for sys.path manipulation such as	
# pygtk.require().	
#init-hook=	

# Use multiple processes to speed up Pylint. specifying 0 will auto-detect the	
# number of processors available to use, and will cap the count on windows to	
# avoid hangs.	
jobs=1	

# Control the amount of potential inferred values when inferring a single	
# object. This can help the performance when dealing with large functions or	
# complex, nested conditions,
limit-inference-results=100	

# List of plugins (as comma separated values of python module names) to load,	
# usually to register additional checkers,	
load-plugins=	

# Pickle collected data for later comparisons.	
persistent=no	

# Minimum Python version to use for version dependent checks. Will default to
# the version used to run pylint.	
py-version=3.8	

# Discover python modules and packages in the file system subtree.	
recursive=no

# Add paths to the list of the source roots. Supports globbing patterns. The	
# source root is an absolute path or a path relative to the current working	
# directory used to determine a package namespace for modules located under the	
# source root.	
source-roots=	

# When enabled, pylint would attempt to guess common misconfiguration and emit	
# user-friendly hints instead of false-positive error messages.	
suggestion-mode=yes	

# Allow loading of arbitrary C extensions. Extensions are imported into the	
# active Python interpreter and may run arbitrary code.	
unsafe-load-any-extension=no	

# In verbose mode, extra non-checker-related info will be displayed.	
#verbose=	


[BASIC]	

# Naming style matching correct argument names.	
argument-naming-style=snake_case	

# Regular expression matching correct argument names. Overrides argument-	
# naming-style. If left empty, argument names will be checked with the set	
# naming style.	
#argument-rgx=	

# Naming style matching correct attribute names.	
attr-naming-style=snake_case	

# Regular expression matching correct attribute names. Overrides attr-naming-	
# style. If left empty, attribute names will be checked with the set naming
# style.	
#attr-rgx=	

# Bad variable names which should always be refused, separated by a comma.	
bad-names=foo,	
          bar,	
          baz,	
          toto,	
          tutu,	
          tata	

# Bad variable names regexes, separated by a comma. If names match any regex,	
# they will always be refused	
bad-names-rgxs=	

# Naming style matching correct class attribute names.	
class-attribute-naming-style=any	

# Regular expression matching correct class attribute hames, Overrides class-	
# attribute-naming-style. If left empty, class attribute names will be checked	
# with the set naming style.	
class-attribute-rgx=

# Naming style matching correct class constant names.	
class-const-naming-style=UPPER_CASE	

# Regular expression matching correct class constant names, Overrides class-	
# const-naming-style. If left empty, class constant names will be checked with	
# the set naming style.	
#class-const-rgx=	

# Naming style matching correct class names.	
class-naming-style=PascalCase	

# Regular expression matching correct class names. Overrides class-naming-	
# style. If left empty, class names will be checked with the set naming style.	
#class-rgx=	

# Naming style matching correct constant names.	
const-naming-style=UPPER_CASE	

# Regular expression matching correct constant names. Overrides const-naming-	
# style. If left empty, constant names will be checked with the set naming	
# style.	
#const-rgx=	

# Minimum line length for functions/classes that require docstrings, shorter	
# ones are exempt.	
docstring-min-length=-1	

# Naming style matching correct function names.	
function-naming-style-camelCase	

# Regular expression matching correct function names. Overrides function-	
# naming-style. If left empty, function names will be checked with the set
# naming style.	
#function-rgx=	

# Good variable names which should always be accepted, separated by a comma.	
good-names=i,	
           j,
           k,	
           ex,	
           Run,	
           _

# Good varlable names regexes, separated by	comma. If names match any regex,	
# they will always be accepted
good-names-rgxs=	

# Include a hint for the correct naming format with invalid-name.	
include-naming-hint=no	

# Naming style matching correct inline iteration names.	
inlinevar-naming-style=any	

# Regular expression matching correct inline iteration names. Overrides	
# inlinevar-naming-style. If left empty, inline iteration names will be checked	
# with the set naming style.	
#inlinevar-rgx=	

# Naming style matching correct method names,	
method-naming-style=camelCase	

# Regulan expression matching correct method names. Overrides method-naming-	
# style. If left empty, method names will be checked with the set naming style.	
#method-rgx=	

# Naming style matching correct module names.	
module-naming-style=camelCase	

# Regular expression matching correct module names. overrides module-naming-	
# style. If left empty, module names will be checked with the set naming style.	
#module-rgx=	

# Colon-delimited sets of names that determine each other's naming style when	
# the name regexes allow several styles.	
name-group=

# Regular expression which should only match function or class names that do	
# not require a docstring.	
no-docstring-rgx=^_	

# List of decorators that produce properties, such as abc.abstractproperty.Add	
# to this list to register other decorators that produce valid properties.	
#These decorators are taken in consideration only for invalid-name.	
property-classes=abc,abstractproperty	

# Regular expression matching correct type alias names. If left empty,type	
# alias names will be checked with the set naming style.	
#typealias-rgx=	

# Regular expression matching correct type variable names. If left empty,type	
# variable names will be checked with the set naming style.	
#typevar-rgx=	

# Naming style matching correct variable names.	
variable-naming-style=snake_case

# Regular expression matching correct variable names. Overrides variable-	
# naming-style. If left empty, variable names will be checked with the set	
# naming style.	
#variable-rgx=	


[CLASSES]	

# Warn about protected attribute access inside special methods	
check-protected-access-in-special-methods=no	

# List of method names used to declare (i.e. assign) instance attributes.	
defining-attr-methods=__init__,	
                      __new___,	
                      setUp,	
                      asyncSetUp,	
                      __post_init__	

# List of member names, which should be excluded from the protected access	
# warning.	
exclude-protected=_asdict,fields,_replace,_source,_make,os._exit	

# List of valid names for the first argument in a class method.	
valid-classmethod-first-arg=cls	

# List of valid names for the first argument in a metaclass class method.	
valid-metaclass-classmethod-first-arg=mcs	


[DESIGN]	

# List of regular expressions of class ancestor names to ignore when counting	
# public methods (see R0903)	
exclude-too-few-public-methods=	

# List of qualified class names to ignore when counting class parents (see	
# R0901)	
ignored-parents=	

# Maximum number of arguments for function / method,	
max-args=6	

# Maximum number of attributes for a class (see R0902).	
max-attributes=10	

# Maximum number of boolean expressions in an if statement (see R0916).	
max-bool-expr=5	

# Maximum number of branch for function / method body.
max-branches=15	

# Maximum number of locals for function / method body.	
max-locals=20	

# Maximum number of parents for a class (see R0901).
max-parents=7	

# Maximum number of public methods for a class (see R0904).	
max-public-methods=20	

# Maximum number of return / yield for function / method body.	
max-returns=6	

# Maximum number of statements in function / method body.	
max-statements=50	

# Minimum number of public methods for a class (see R0903).	
min-public-methods=2	


[EXCEPTIONS]	

# Exceptions that will emit a warning when caught.	
overgeneral-exceptions=builtins.BaseException,builtins.Exception	


[FORMAT]	

# Expected format of line ending, e.g. empty (any line ending),LF or CRLF.	
expected-line-ending-format=	

# Regexp for a line that is allowed to be longer than the limit.	
ignore-long-lines=^\s*(# )?<?https?://\S+>?$	

# Number of spaces of indent required inside a hanging or continued line.	
indent-after-paren=4	

# string used as indentation unit. This is usually "" (4 spaces) or "\t" (1	
# tab).	
indent-string='    '

# Maximum number of characters on a single line.	
max-line-length=120	

# Maximum number of lines in a module.	
max-module-lines=1000	

# Allow the body of a class to be on the same line as the declaration if body	
# contains single statement.
single-line-class-stmt=no	

# Allow the body of an if to be on the same line as the test if there is no	
# else.	
single-line-if-stmt=no	


[IMPORTS]	

# List of modules that can be imported at any level, not just the top level	
# one.	
allow-any-import-level=	

# Allow explicit reexports by alias from a package __init__.	
allow-reexport-from-package=no	

# Allow wildcard imports from modules that define _all__.	
allow-wildcard-with-all=no	

# Deprecated modules which should not be used, separated by a comma.	
deprecated-modules=	

# 0utput a graph (.gv or any supported image format) of external dependencies	
# to the given file (report Rp0402 must not be disabled).	
ext-import-graph=	

# Output a graph (-gv or any supported image format) of all (i.e. internal and	
# external) dependencies to the given file (report RP0402 must not be	
# disabled).	
import-graph=	

# Output a graph (.gv or any supported image format) of internal dependencies	
# to the given file (report Rp0402 must not be disabled).	
int-import-graph=	

# Force import order to recognize a module as part of the standard	
# compatibility libraries.	
known-standard-library=

# Force import order to recognize a module as part of a third party library.	
known-third-party=enchant	

# Couples of modules and preferred modules, separated by a comma.	
preferred-modules=	


[LOGGING]

# The type of string formatting that logging methods do. `old` means using %	
# formatting,`new` is for`{}` formatting.
logging-format-style=old	

# Logging modules to check that the string format arguments are in logging	
# function parameter format.	
logging-modules=logging	


[MESSAGES CONTROL]	

# only show warnings with the listed confidence levels. Leave empty to show	
# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,	
# UNDEFINED.	
confidence=HIGH,	
           CONTROL_FLOW,	
           INFERENCE,	
           INFERENCE_FAILURE,	
           UNDEFINED	

# Disable the message, report, category or checker with the given id(s). You	
# can either give multiple identifiers separated by comma (,) or put this	
# option multiple times (only on the command line, not in the configuration	
# file where it should appear only once). You can also use "--disable=all" to	
# disable everything first and then re-enable specific checks. For example, if	
# you want to run only the similarities checker, you can use "--disable=all	
#	--enable=similarities". If you want to run only the classes checker, but have	
# no Warning level messages displayed, use "--disable=all --enable=classes	
# --disable=W".	
disable=raw-checker-failed,	
        bad-inline-option,	
        locally-disabled,	
        file-ignored,	
        suppressed-message,	
        useless-suppression,	
        deprecated-pragma,	
    	use-symbolic-message-instead,	
        E0401,	
        C0111,	
        R0903,	
        E1101,	
        C0209,	
        W0718,	
        R1732,	
        W0603	

# Enable the message, report, category or checker with the given id(s). You can	
# either give multiple identifier separated by comma (,) or put this option	
# multiple time (only on the command line, not in the configuration file where	
# it should appear only once). see also the "--disable" option for examples.	
enable=c-extension-no-member	


[METHOD_ARGS]	

# List of qualified names (i.e., library.method) which require a timeout	
# parameter e.g.'requests.api.get,requests.api.post'	
timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request


[MISCELLANEOUS]	

# List of note tags to take in consideration, separated by a comma.	
notes=FIXME,	
      xxx,	
      TODO	

# Regular expression of note tags to take in consideration.	
notes-rgx=	


[REFACTORING]	

# Maximum number of nested blocks for function / method body	
max-nested-blocks=7	

# Complete name of functions that never returns. When checking for	
# inconsistent-return-statements if a never returning function is called then I	
# it will be considered as an explicit return statement and no message will be	
# printed.	
never-returning-functions=sys.exit,argparse.parse_error


[REPORTS]	

# Python expression which should return a score less than or equal to 10. You	
# have access to the variables 'fatal', 'error', 'warning', 'refactor',	
# 'convention', and 'info' which contain the number of messages in each	
# category, as well as 'statement' which is the total number of statements	
# analyzed. This score is used by the global evaluatiop report(RP0004).	
evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))

# Template used to display messages. This is a python new-style format string	
# used to format the message information. see doc for all details.	
msg-template=	

# Set the output format. Available formats are text, parseable, colorized,json	
# and msvs (visual studio). You can also give a reporter class,e.g.	
# mypackage,mymodule.MyReporterClass.	
#output-format=	

# Tells whether to display a full report or only the messages.	
reports=no	

#Activate the evaluation score.	
score=yes	

output-format=colorized	


[SIMILARITIES]

# Comments are removed from the similarity computation	
ignore-comments=yes	

# Docstrings are removed from the similarity computation	
ignore-docstrings=yes	

# Imports are removed from the similarity computation	
ignore-imports=yes	

# Signatures are removed from the similarity computation	
ignore-signatures=yes	

# Minimum lines number of a similarity.	
min-similarity-lines=4	


[SPELLING]	

# Limits count of emitted suggestions for spelling mistakes.	
max-spelling-suggestions=4	

# Spelling dictionary name. No available dictionaries : You need to install	
# both the python package and the system dependency for enchant to work..	
spelling-dict=	

# List of comma separated words that should be considered directives if they	
# appear at the beginning of a comment and should not be checked.	
spelling-ignore-comment-directives=fmt: on,fmt: off,noga:,noqa,nosec,isort:skip,mypy:

# List of comma separated words that should not be checked.	
spelling-ignore-words=	

# A path to a file that contains the private dictionary; one word per line.	
spelling-private-dict-file=	

# Tells whether to store unknown words to the private dictionary (see the	
# --spelling-private-dict-file option) instead of raising a message.	
pelling-store-unknown-words=no	


[STRING]	

# This flag controls whether inconsistent-quotes generates a warning when the	
# character used as a quote delimiter is used inconsistently within a module.	
check-quote-consistency=no	

#This flag controls whether the implicit-str-concat should generate a warning
# on implicit string concatenation in sequences defined over several lines. 
check-str-concat-over-line-jumps=no


[TYPECHECK]

# List of decorators that produce context managers, such as
# contextlib.contextmanager. Add to this list to register other decorators that
# produce valid context managers.
contextmanager-decorators=contextlib.contextmanager

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.	
generated-members=

# Tells whether to warn about missing members when the owner of the attribute	
# is inferred to be None.	
ignore-none=yes	

# This flag controls whether pylint should warn about no-member and similar	
# checks whenever an opaque object is returned when inferring. The inference
# can return multiple potential results while evaluating a Python object, but	
# some branches might not be evaluated, which results in partial inference. In	
# that case, it might be useful to still emit no-member and other checks for	
# the rest of the inferred objects.	
ignore-on-opaque-inference=yes	

# List of symbolic message names to ignore for Mixin members.	
ignored-checks-for-mixins=no-member,	
                          not-async-context-manager,	
                          not-context-manager,
                          attribute-defined-outside-init	

# List of class names for which member attributes should not be checked (useful	
# for classes with dynamically set attributes). This supports the use of	
# qualified names.	
ignored-classes=optparse.Values,thread._local,_thread ._local,argparse.Namespace	

# show a hint with possible names when a member name was not found. The aspect	
# of finding the hint is based on edit distance.	
missing-member-hint=yes

# The minimum edit distance a name should have in order to be considered a	
# similar match for a missing member name,	
missing-member-hint-distance=1	

# The total number of similar names that should be taken in consideration when	
# showing a hint for a missing member.	
missing-member-max-choices=1	

# Regex pattern to define which classes are considered mixins.	
mixin-class-rgx=.*[Mm]ixin	

# List of decorators that change the signature of a decorated function.	
signature-mutators=	


[VARIABLES]	

# List of additional names supposed to be defined in builtins. Remember that	
# you should avoid defining new builtins when possible.	
additional-builtins=	

# Tells whether unused global variables should be treated as a violation.	
allow-global-unused-variables=yes	

# List of names allowed to shadow builtins	
allowed-redefined-builtins=	

# List of strings which can identify a callback function by name. A callback	
# name must start or end with one of those strings. I	
callbacks=cb_,	
          _cb	

# A regular expression matching the name of dummy variables (i.e. expected to	
# not be used).	
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Ze-9]+?$)|dummy|^ignored_|^unused_	

# Argument names that match this expression will be ignored.	
ignored-argument-names=_.*|^ignored_|^unused_	

# Tells whether we should check for unused import in _init_ files.	
init-import=no	

# List of qualified module names which can have objects that can redefine	
# builtins.	
redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io	

Spring Boot-Java

环境

...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>	
                <artifactId>maven-checkstyle-plugin</artifactId>	
                <version>3.1.2</version>	
                <dependencies>	
                    <dependency>	
                        <groupId>com.puppycrawl.tools</groupId>	
                        <artifactId>checkstyle</artifactId>	
                        <version>8.41.1</version>	
                    </dependency>	
                </dependencies>	
                <configuration>	
                    <configLocation>style/checkstyle.xml</configLocation>	
                    <encoding>UTF-8</encoding>	
                    <consoleOutput>true</console0utput>	
                    <failsOnError>true</failsOnError>	
                    <linkXRef>false</linkXRef>	
                    <excludes>${protobuf.package},${lane.package}</excludes>	
                </configuration>	
                <executions>	
                    <execution>	
                        <id>validate</id>	
                        <phase>validate</phase>	
                        <goals>	
                            <goal>check</goal>
                        </goals>
                    </execution>	
                </executions>
            </plugin>	
        </plugins>
    </build>
...

模板

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">

<module name="Checker">
    <property name="charset"value="UTF-8" />
    <property name="fileExtensions" value="java, properties" />
    <property name="localeCountry" value="CN" />
    <property name="localeLanguage" value="en"/>

    <module name="BeforeExecutionExclusionFileFilter">
        <property name="fileNamePattern" value="^(module|package)\-info\.java$" />
    </module>
    <module name="SuppressWarningsFilter" />
    <module name="NewlineAtEndofFile"/>
    <module name="FileTabCharacter">
        <property name="eachLine" value="true" />
    </module>
    <module name="FileLength">
        <property name="max" value="1500"/>
    </module>
    <module name="LineLength">
        <property name="fileExtensions" value="java" />
        <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://" />
        <property name="max" value="200"/>
    </module>
    <module name="TreeWalker">
        <module name="SuppressionCommentFilter">
            <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
            <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
            <property name="checkFormat" value="$1"/>
        </module>
    
        <!-- https://checkstyle.org/config_annotation.html -->
        <module name="SuppressWarningsHolder" />
        <module name="MissingOverride" />

        <!-- https://checkstyle.org/config_blocks.html -->
        <module name="AvoidNestedBlocks" />
        <module name="EmptyBlock">
            <property name="option" value="text" />
        </module>
        <module name="EmptyCatchBlock"/>
        <module name="NeedBraces"/>
        <module name="LeftCurly" />
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="option" value="same"/>
            <property name="tokens" value="LITERAL_TRY,LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO" />
        </module>
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone" />
            <property name="tokens" value="CLASS_DEF, METHOD_DEF , CTOR DEF, LITERAL_FOR, LITERAL_WHILE , STATIC_INIT,INSTANCE_INIT ,ANNOTATION_DEF,ENUM_DEF">
        </module>

        <!-- https://checkstyle.org/config_design.html -->
        <module name="Finalclass"/>
        <module name="InterfaceIsType"/>
        <module name="VisibilityModifier">
            <property name="packageAllowed" value="true" />
            <property name="protectedAllowed" value="true" />
        </module>

        <!-- https://checkstyle.org/config_coding.html-->
        <module name="DefaultComesLast"/>
        <module name="EmptyStatement" />
        <module name="EqualsAvoidNull"/>
        <module name="EqualsHashCode"/>
        <module name="FallThrough" />
        <module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF" />
            <message key="hidden.field" value="局部变量 ''{0}''的名字不能和成员变量相同(方法参数/lambda参数除外)"/>
        </module>
        <module name="InnerAssignment" />
        <module name="MagicNumber">
            <property name="ignoreAnnotation" value="true" />
            <property name="ignoreHashCodeMethod" value="true" />
            <property name="ignoreAnnotationElementDefaults" value="true" />
        </module>
        <module name="MissingSwitchDefault" />
        <module name="NestedForDepth">
            <property name="max" value="2" />
            <message key="nested.for.depth" value="除最外层for,至多允许嵌套{1,number,integer}层,目前{e,number,integer}层" />
        </module>
        <module name="NestedIfDepth">
            <property name="max" value="2" />
            <message key="nested. if.depth" value="除最外层if,至多允许嵌套{1,number,integer}层,目前{0,number,integer}层" />
        </module>
        <module name="NestedTryDepth">
            <property name="max" value="2" />
            <message key="nested.try.depth" value="除最外层if,至多允许嵌套{1,number,integer}层,目前{0,number,integer}层" />
        </module>
        <module name="OneStatementPerLine" />
        <module name="SimplifyBooleanReturn" />
        <module name="SimplifyBooleanExpression" />
        <module name="StringLiteralEquality"/>
        <module name="SuperClone"/>
        <module name="SuperFinalize" />

        <!-- https://checkstyle.org/config_imports.html -->
        <module name="IllegalImport" />
        <module name="RedundantImport" />
        <module name="UnusedImports"/>

        <!-- https://checkstyle.org/config_javadoc.html -->
        <module name="MissingJavadocMethod">
            <property name="allowedAnnotations" value="Override, Test" />
            <property name="allowMissingPropertyJavadoc" value="true" />
            <message key="javadoc.missing" value="除@Override/@Test/getter/setter外,所有公有方法/构造方法/注解属性,都必须要有注释"/>
        </module>

        <!-- https://checkstyle.org/config_misc.html -->
        <module name="ArrayTypeStyle" />
        <module name="Indentation"/>
        <module name="UncommentedMain">
            <property name="excludedClasses"value=".*Application$" />
        </module>
        <module name="UpperEl1" />

        <!-- https://checkstyle.org/config_modifier.html -->
        <module name="ModifierOrder" />
        <module name="RedundantModifier" />

        <!-- https://checkstyle.org/config_naming -->
        <module name="AbstractClassName">
            <property name="format" value="^(Abstract|Base)[A-Z][a-zA-Z0-9]*$" />
            <property name="ignoreModifier" value="true" />
            <message key="name.invalidPattern" value="抽象类命名使用Abstract或Base开头" />
        </module>	
        <module name="CatchParameterName" />
        <module name="ClassTypeParameterName" />
        <module name="ConstantName" />
        <module name="InterfaceTypeParameterName" />
        <module name="LambdaParameterName" />
        <module name="LocalFinalVariableName" />
        <module name="LocalVariableName" />
        <module name="MemberName" />
        <module name="MethodName">
            <property name="format" value="^[_a-z]([a-zA-Z0-9]+)*$" />
        </module>
        <module name="MethodTypeParameterName" />
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
        </module>
        <module name="ParameterName">
            <property name="ignoreOverridden" value="true" />
        </module>
        <module name="StaticVariableName"/>
        <module name="TypeName">
            <property name="severity" value="warning" />
        </module>

        <!-- https://checkstyle.org/config_regexp.html -->
        <module name="Regexp">
            <property name="format" value="System\.out\.println" />
            <property name="illegalPattern" value="true" />
        </module>

        <!-- https://checkstyle.org/config_sizes.html -->
        <module name="MethodLength">
            <property name="tokens" value="METHOD_DEF" />
            <property name="max" value="200" />
        </module>
        <module name="ParameterNumber">
            <property name="tokens" value="METHOD_DEF" />
            <property name="max" value="7" />
        </module>

        <!-- https://checkstyle.org/config_whitespace.html -->
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true" />
            <property name="allowMultipleEmptyLines" value="false" />
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false" />
        </module>
        <module name="GenericWhitespace" />
        <module name="MethodParamPad" />
        <module name="NoLineWrap" />
        <module name="NoWhitespaceAfter" />
        <module name="NoWhitespaceBefore" />
        <module name="OperatorWrap" />
        <module name="ParenPad" />
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapNL" />
            <property name="tokens" value="DOT" />
            <property name="option" value="nl" />
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapEOL" />
            <property name="tokens" value="COMMA, ELLIPSIS, ARRAY_DECLARATOR" />
            <property name="option" value="EOL" />
        </module>
        <module name="TypecastParenPad" />
        <module name="WhitespaceAfter" />
        <module name="WhitespaceAround" />
    </module>
</module>

Vue/Vite-TypeScript

环境

package.json

{
    "dependencies": {
        "vite-plugin-eslint": "^1.8.1",
        "vue": "^3.2.13",
        "vue-eslint-parser": "^9.3.1"
    },
    "devDependencies": {
        "typescript-eslint/eslint-plugin": "^5.59.11",
        "eslint": "^8.42.0",
        "eslint-config-standard": "^17.1.0",
        "eslint-plugin-import": "^2.27.5",
        "eslint-plugin-prettier": "^4.2.1",
        "eslint-plugin-security": "^1.7.1",
        "eslint-plugin-vue": "^9.14.1",
        "typescript": "^5.0.2",
        "vite": "^4.4.5"
    }
}

模板

module.exports = {	
    root: true,	
    env:{	
        node: true,	
        browser: true,	
        es6: true,	
        es2021: true	
    },	
    settings: {	
        // 'import/resolver': {	
        // alias: {	
        //	 map: ['@','./src']	
        // }	
        //}	
    },	
    extends: [	
        'standard',	
        'eslint:recommended',	
        'plugin:vue/vue3-recommended',	
        'plugin:security/recommended',	
        // 'plugin:import/errors',	
        'plugin:import/warnings',	
        'plugin:import/typescript',	
        'plugin:@typescript-eslint/base',	
        './.eslintrc-auto-import.json'	
    ],	
    ignorePatterns: [ // 忽略以下文件
        '.eslintrc.cjs',	
        'helpPage.vue',	
        'proto/'	
    ],	
    parser: 'vue-eslint-parser',
    parserOptions:{	
        ecmaVersion: 'latest',	
        sourceType: 'module',	
        parser; '@typescript-eslint/parser'	
    }	
    plugins:[	
        'vue',	
        '@typescript-eslint',	
        'security',	
        'import'	
    ],	
    globals: { // 忽略以下变里的检查	
        defineExpose:'readonly',	
        defineProps: 'readonly',	
        defineEmits: 'readonly'
    },
    rules:{
        'no-var': 'error', // 禁止使用 var
        'no-console': 'warn', // 禁止在生产环境使用console	
        'no-continue': 'error', // 禁止在循环体内使用continue	
        'no-param-reassign': [ 'error', { props: false } ],// 禁止在函数体内重写对象的属性
        'no-await-in-loop':'error', // 禁止在循环体中使用await,可以用promise.all代替
        'no-mixed-spaces-and-tabs': 'error',// 禁止空格与tab混用
        'no-useless-constructor': 'off', // sometimes constructor is necessary to generate right documentation in cvat-core
        'no-unneeded-ternary': 'off', // 禁止多余的三元表达式
        'no-unused-vars': [
            'error',
            {
                'varsignorePattern': 'handle|jumpTo|ignore|const|props|rules|zhCn|extensions|options',	 // 忽略包含以下内容的变量
                'argsIgnorePattern': 'ws|ev|pre',  // 忽略包含以下内容的参数
            }
        ],

        'vue/multi-word-comeponent-names': 'off', // 组件命名需要用超过两个单词
        'vue/html-closing-bracket-newline': 'off', // 强制换行
        'vue/html-self-closing':'off', // 强制使用vue自带component	
        'vue/html-indent': [ 'error', 4 ], // html缩进
        'vue/singleline-html-element-content-newline': 'off', // 不强制换行
        'vue/max-attributes-per-line': 'off', // 不检查单行最大属性个数
        'vue/no-multiple-template-root': 'off',	// 不检查template模板元素个数	

        quotes: [ 'error', 'single' ], // 引号类型
        indent: [ 'error', 4, { switchCase: 1 } ], // 缩进
        'lines-between-class-members': 'off', // 类成员之间需要空行
        'class-methods-use-this': 'off', // 类方法使用this
        'max-len': [ 'error', { code: 100, ignorestrings: true } ], // 单行最大长度
        'func-names': 'off', // 函数需要名称
        'valid-typeof': 'off',	// 强制将 typeof 表达式与有效字符串进行比较
        'space-before-function-paren': 'off', // 函数名后需要空格
        'max-classes-per-file': 'off', // 单文件最大类个数
        'prefer-const':'off', // 禁止未使用的变里强制使用const 因为ref使用的是obj.value方式操作变里
        'operator-linebreak': [ 'error', 'after' ],	
        'newline-per-chained-call': 'off', // 要求方法链中每个调用都有一个换行符
        'global-require': 'off', // 强制在模块顶部调用 require()
        'arrow-parens': [ 'error', 'always' ], // 要求箭头函数的参数使用圆括号
        'security/detect-object-injection': 'off' // the rule is relevant for user input data on the node.js environment	
        'import/order': [ 'error', { groups: ['builtin', 'external','internal'] } ],
        'import/prefer-default-export': 'off', // works incorrect with interfaces

        'camelcase': 'off',	// 命名规范
        '@typescript-eslint/no-explicit-any': 'off', // 禁止使用any类型
        '@typescript-eslint/naming-convention': [ // 命名规范
            'warn',
            {	
                'selector': 'default',	
                'format': [ 'snake_case', 'camelCase'],	
            },	
            {
                'selector': 'interface',	
                'format': [ 'PascalCase'],	
            },	
            {	
                'selector': 'class',	
                'format': [ 'PascalCase'],	
            },	
            {	
                'selector': 'method',	
                'format': [ 'camelCase' ],	
            },	
            {	
                'selector': 'function',	
                'format': [ 'camelcase' ],	
            },	
            {	
                'selector': 'typeAlias',	
                'format': [ 'PascalCase' ],	
            },
            {	
                'selector': 'enum',	
                'format': [ 'PascalCase' ],	
            },	
            {	
                'selector': 'enumMember',	
                'format': [ 'UPPER_CASE' ],	
            },	
            {
                'selector'; 'variable',	
                'format': [ 'snake_case', 'camelCase', 'PascalCase' ],	
                'leadingUnderscore': 'allow',	
                'trailingUnderscore': 'allow',	
                'filter': {	
                    'regex': 'const|store|jumpTo',	
                    'match': false	
                }
            },
            {
                'selector': 'property',
                'format': [ 'snake_case', 'camelCase', 'PascalCase', 'UPPER_CASE' ],	
            },
            {
                'selector': 'parameter',	
                'format': [ 'camelCase' ],	
            },	
            {	
                'selector': 'typeParameter',	
                'format': [ 'snake_case' ],	
            }
        ]
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值