phpcsstandards / phpcsextra
PHP_CodeSniffer 的嗅探器和标准的集合。
资助包维护!
Open Collective
PHPCSStandards
jrfnl
Requires
- php: >=5.4
- phpcsstandards/phpcsutils: ^1.0.9
- squizlabs/php_codesniffer: ^3.8.0
Requires (Dev)
- php-parallel-lint/php-console-highlighter: ^1.0
- php-parallel-lint/php-parallel-lint: ^1.3.2
- phpcsstandards/phpcsdevcs: ^1.1.6
- phpcsstandards/phpcsdevtools: ^1.2.1
- phpunit/phpunit: ^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0
This package is auto-updated.
Last update: 2024-09-12 02:00:25 UTC
README
简介
PHPCSExtra 是用于 PHP_CodeSniffer 的嗅探器和标准的集合。
最低要求
- PHP 5.4 或更高版本。
- PHP_CodeSniffer 版本 3.8.0 或更高。
- PHPCSUtils 版本 1.0.9 或更高。
安装
强烈推荐使用 Composer 进行安装。
Composer 将自动安装项目依赖项,并使用 Composer PHPCS 插件 将 PHPCSExtra 和其他外部标准的规则集注册到 PHP_CodeSniffer。
基于 Composer 的项目安装
在项目的根目录下运行以下命令
composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true composer require --dev phpcsstandards/phpcsextra:"^1.2.0"
全局 Composer 安装
或者,您可能想全局安装此标准
composer global config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true composer global require --dev phpcsstandards/phpcsextra:"^1.2.0"
更新到较新版本
如果您使用上述任一命令安装了 PHPCSExtra,您可以通过以下方式更新到较新版本
# Project local install composer update phpcsstandards/phpcsextra --with-dependencies # Global install composer global update phpcsstandards/phpcsextra --with-dependencies
如果您的项目在其
composer.json
文件中包含对squizlabs/php_codesniffer
、phpcsstandards/phpcsutils
或dealerdirect/phpcodesniffer-composer-installer
包的require[-dev]
,您可能需要使用--with-all-dependencies
而不是--with-dependencies
。💡 提示:除非您的项目是实际直接使用这些包的 PHPCS 标准,否则建议从您自己的
composer.json
文件中删除这些包,以便让 PHPCSExtra(以及您可能使用的其他外部 PHPCS 标准)管理这些包的版本要求。
功能
安装此项目后,您将在运行 vendor/bin/phpcs -i
时看到安装标准列表中的三个新规则集:Modernize
、NormalizedArrays
和 Universal
。
Modernize
规则集是一个检查代码现代化机会的标准。- 《NormalizedArrays》规则集是一种用于检查数组声明格式的标准。
- 《Universal》规则集不是一个标准,而是一个嗅探集合。它不应该作为标准包含在自定义规则集中,因为它包含相互矛盾的规则。相反,应将此标准中的单个嗅探包含在自定义项目/公司规则集中以使用它们。
嗅探器
图例:
- 🔧 = 包含自动修复器。 使用
phpcbf
命令运行修复器。 - 📊 = 包含度量。 使用
phpcs
与--report=info
查看度量。 - 📚 = 包含 CLI 文档。 使用
phpcs
与--generator=Text
查看文档。
现代化
Modernize.FunctionCalls.Dirname
🔧 📚
此嗅探器将检测并自动修复与 dirname()
函数相关的两个典型代码现代化。
- 自 PHP 5.3 以来,可以使用
__DIR__
替换对dirname(__FILE__)
的调用。错误代码:Modernize.FunctionCalls.Dirname.FileConstant
。 - 自 PHP 7.0 以来,嵌套调用
dirname()
可以更改为使用$levels
参数。错误代码:Modernize.FunctionCalls.Dirname.Nested
。
如果使用 --config-set
或 --runtime-set
将 php_version
配置选项 传递给 PHPCS,则嗅探器将予以尊重。这意味着嗅探器将只报告适用于配置的 PHP 版本的现代化。
规范化数组
NormalizedArrays.Arrays.ArrayBraceSpacing
🔧 📊 📚
强制执行数组声明中开/闭花括号的统一间距。
嗅探器允许为以下设置使用不同的设置:
- 通过
keywordSpacing
属性,长数组中数组关键字与开括号之间的空格。接受值:(int)空格数或false
以关闭此检查。默认为0
个空格。 - 通过
spacesWhenEmpty
属性,空数组内部的空格。接受值:(string)newline
、(int)空格数或false
以关闭此检查。默认为0
个空格。 - 通过
spacesSingleLine
属性,单行数组内部的空格;接受值:(int)空格数或false
以关闭此检查。默认为0
个空格。 - 通过
spacesMultiLine
属性,多行数组内部的空格。接受值:(string)newline
、(int)空格数或false
以关闭此检查。默认为newline
。
注意:如果上述任何属性设置为 newline
,则建议还包括数组缩进嗅探器。此嗅探器不会处理缩进。
NormalizedArrays.Arrays.CommaAfterLast
🔧 📊 📚
强制执行/禁止在数组声明中的最后一个项目后使用逗号。
默认情况下,此嗅探器将
- 对于单行数组,禁止在最后一个数组项目后使用逗号。
- 对于多行数组,强制在最后一个数组项目后使用逗号。
可以通过在自定义规则集中设置 singleLine
和/或 multiLine
属性来为每种类型或数组单独更改这些设置。
使用以下任何值更改属性:enforce
、forbid
或 skip
以跳过检查特定类型数组后的最后一个数组项后的逗号。
singleLine
属性的默认值为 forbid
。 multiLine
属性的默认值为 enforce
。
通用
Universal.Arrays.DisallowShortArraySyntax
🔧 📊 📚
禁止短数组语法。
与 PHPCS 本地的 Generic.Arrays.DisallowShortArraySyntax
嗅探器相比,此嗅探器将忽略短列表语法,并使用修复器时不会导致解析错误。
Universal.Arrays.DuplicateArrayKey
📚
检测数组声明中的重复数组键。
嗅探器将在所有PHP版本中重复的键和仅在PHP < 8.0 或 PHP >= 8.0中重复的(数字)键之间进行区分。
如果使用--config-set
或--runtime-set
将php_version
配置选项传递给PHPCS,嗅探器将尊重该设置,并且只报告配置的PHP版本的重复键。
Universal.Arrays.MixedArrayKeyTypes
📚
最佳实践嗅探器:不要为数组元素混合使用整数和字符串键。
Universal.Arrays.MixedKeyedUnkeyedArray
📚
最佳实践嗅探器:不要混合使用带键和不带键的数组元素。
Universal.Classes.DisallowAnonClassParentheses
🔧 📊 📚
禁止在未传递参数的情况下声明匿名类时使用括号。
Universal.Classes.RequireAnonClassParentheses
🔧 📊 📚
在声明匿名类时要求使用括号,无论是否传递参数。
Universal.Classes.DisallowFinalClass
🔧 📊 📚
禁止声明为final
的类。
Universal.Classes.RequireFinalClass
🔧 📊 📚
要求所有非abstract
类都声明为final
。
⚠️ 警告:此嗅探器的自动修复器可能会对应用程序产生意外的副作用,应谨慎使用!这被认为是一个危险的修复器。
Universal.Classes.ModifierKeywordOrder
🔧 📊 📚
要求对类声明使用一致的修饰符关键字顺序。
- 此嗅探器包含一个
order
属性,用于指定首选顺序。接受值:(字符串)'extendability readonly'
|'readonly extendability'
。默认为'extendability readonly'
。
Universal.CodeAnalysis.ConstructorDestructorReturn
🔧 📚
- 禁止在构造函数/析构函数方法上声明返回类型 - 错误代码:
ReturnTypeFound
,可自动修复。 - 不建议构造函数/析构函数方法返回值 - 错误代码:
ReturnValueFound
。
如果使用--config-set
或--runtime-set
将php_version
配置选项传递给PHPCS,嗅探器将尊重该设置。实际上,这意味着如果配置的PHP版本小于8.0,则嗅探器将仅报告PHP4风格的构造函数。
Universal.CodeAnalysis.ForeachUniqueAssignment
🔧 📚
检测使用相同的变量进行键和值赋值的foreach
控制结构,这将导致意外的(而且很可能是非预期的)行为。
注意:修复器将保持代码的现有行为。这可能不是预期的行为。
Universal.CodeAnalysis.NoDoubleNegative
🔧 📚
检测代码中的双重否定!!
,这实际上等同于布尔类型转换,但认知负荷更高。同时检测三重否定!!!
,这实际上等同于单重否定。
嗅探器具有模块化错误代码,允许禁用单个检查。错误代码是:FoundDouble
、FoundDoubleWithInstanceof
(不可自动修复)和FoundTriple
。
Universal.CodeAnalysis.NoEchoSprintf
🔧 📚
检测使用效率低下的echo [v]sprintf(...);
组合。请使用[v]printf()
代替。
Universal.CodeAnalysis.StaticInFinalClass
🔧 📚
检测在final
的OO结构中使用static
代替self
。
- 嗅探器具有模块化错误代码,允许根据
static
的使用类型进行例外处理。可用的错误代码是:ReturnType
、InstanceOf
、NewInstance
、ScopeResolution
。
Universal.Constants.LowercaseClassResolutionKeyword
🔧 📊 📚
确保在用于类名解析时(即 ::class
),class
关键字为小写。
Universal.Constants.ModifierKeywordOrder
🔧 📊 📚
要求对面向对象常量声明进行一致的修饰符关键字顺序。
- 此嗅探器包含一个
order
属性来指定首选顺序。接受值:(字符串)'final visibility'
|'visibility final'
。默认为'final visibility'
。
Universal.Constants.UppercaseMagicConstants
🔧 📊 📚
强制使用大写字母来使用 PHP 原生魔法常量,如 __FILE__
等。
Universal.ControlStructures.DisallowAlternativeSyntax
🔧 📊 📚
禁止使用控制结构的替代语法。
- 此嗅探器包含一个
allowWithInlineHTML
属性,允许在控制结构中使用内联 HTML 时使用替代语法。在其他所有情况下,仍然禁止使用替代语法。接受值:(布尔值)true
|false
。默认为false
。 - 该嗅探器具有模块化错误代码,允许根据特定的控制结构以及/或特定的控制结构与内联 HTML 的组合进行异常处理。错误代码遵循以下模式:
Found[ControlStructure][WithInlineHTML]
。例如:FoundIf
,FoundSwitchWithInlineHTML
。
Universal.ControlStructures.DisallowLonelyIf
🔧 📚
禁止将 if
语句作为 else
块中的唯一语句。
注意:此嗅探器不会修复“内部”代码的缩进。强烈建议与 Generic.WhiteSpace.ScopeIndent
嗅探器一起运行此嗅探器以获得正确的缩进。
Universal.ControlStructures.IfElseDeclaration
🔧 📊 📚
验证带大括号的 else(if) 语句是否在新的一行。
Universal.Files.SeparateFunctionsFromOO
📊 📚
强制文件要么声明(全局/命名空间)函数,要么声明面向对象结构,但不能同时声明两者。
- 嵌套函数声明(即在函数/方法中声明的函数)将在此嗅探器的目的上不予考虑。匿名类、闭包和箭头函数也是如此。
- 注意:此嗅探器对副作用没有意见。如果您想嗅探这些,请使用 PHPCS 原生的
PSR1.Files.SideEffects
嗅探器。 - 另请注意:此嗅探器对单个文件中声明的多个面向对象结构没有意见。如果您想嗅探这些,请使用 PHPCS 原生的
Generic.Files.OneObjectStructurePerFile
嗅探器。
Universal.FunctionDeclarations.NoLongClosures
📊 📚
检测“长”闭包并建议使用命名函数。
通过在自定义规则集中设置以下属性之一来配置此嗅探器:
recommendedLines
(整数):确定何时抛出警告。默认为5
,这意味着如果闭包超过 5 行,则会抛出具有错误代码ExceedsRecommended
的警告。maxLines
(整数):确定何时抛出错误。默认为8
,这意味着如果闭包超过 8 行,则会抛出具有错误代码ExceedsMaximum
的错误。ignoreCommentLines
(布尔值):是否忽略仅注释的行以进行行计数。默认为true
。ignoreEmptyLines
(布尔值):是否忽略空白行以进行行计数。默认为true
。
Universal.FunctionDeclarations.RequireFinalMethodsInTraits
🔧 📊 📚
强制在 traits 中声明非私有、非抽象方法为 final
。
可用的错误代码是:NonFinalMethodFound
和 NonFinalMagicMethodFound
。
Universal.Lists.DisallowLongListSyntax
🔧 📚
禁止使用长 list
。
有关长列表与短列表使用情况的度量标准,请使用
Universal.Lists.DisallowShortListSyntax
嗅探器。
Universal.Lists.DisallowShortListSyntax
🔧 📊 📚
禁止使用短列表。
Universal.Namespaces.DisallowDeclarationWithoutName
📊 📚
禁止没有命名空间名称的命名空间声明。
此嗅探器仅适用于使用大括号语法的命名空间声明。
Universal.Namespaces.DisallowCurlyBraceSyntax
📊 📚
禁止使用大括号的替代命名空间声明语法。
Universal.Namespaces.EnforceCurlyBraceSyntax
📊 📚
强制使用大括号作为命名空间语法。
Universal.Namespaces.OneDeclarationPerFile
📚
禁止在一个文件中使用多个命名空间。
Universal.NamingConventions.NoReservedKeywordParameterNames
📚
禁止使用保留关键字作为函数参数名称,因为当人们使用命名参数调用函数时,这可能会很快变得令人困惑。
- 该嗅探器具有模块化错误代码,允许对特定关键字进行异常处理。错误代码遵循以下模式:
[keyword]Found
。
Universal.OOStructures.AlphabeticExtendsImplements
🔧 📊 📚
强制类/枚举中的“implements”语句或接口中的“extends”语句中使用的名称按字母顺序列出。
- 此嗅探器包含一个
orderby
属性,用于确定语句的排序顺序。如果所有使用的名称都是非限定性的,则排序顺序无关紧要。然而,如果一个或多个名称部分或完全限定,则选择的排序顺序将确定非限定性、部分限定和完全限定名称之间的排序处理方式。该嗅探器支持两种排序顺序选项- 'name':仅按接口名称排序(默认);
- 'full':按语句中使用的完整名称排序(不带前导反斜杠)。在两种情况下,排序都将使用自然排序,不区分大小写。
- 该嗅探器具有模块化错误代码,允许选择性包含/排除
ImplementsWrongOrder
- 用于“class implements”语句。ImplementsWrongOrderWithComments
- 用于嵌有注释的“class implements”语句。这些将不会自动修复。ExtendsWrongOrder
- 用于“interface extends”语句。ExtendsWrongOrderWithComments
- 用于嵌有注释的“interface extends”语句。这些将不会自动修复。
- 在修复时,
implements
/extends
语句中名称之间现有的间距将不会被保留。修复器将使用逗号和一个空格分隔每个名称。如果需要不同的格式化,则应将一个将检查和修复格式的嗅探器添加到规则集中。
Universal.Operators.ConcatPosition
🔧 📊 📚
强制多行连接运算符在首选位置,要么总是在下一行的开头,要么总是在前一行的末尾。
- 此嗅探器包含一个
allowOnly
属性来设置运算符的首选位置。接受值:(字符串)"start"
或"end"
。默认为"start"
。 - 注意:行中连接仍然允许,并且此嗅探器不会将其标记。
Universal.Operators.DisallowLogicalAndOr
📊 📚
强制使用布尔运算符&&
和||
,而不是逻辑运算符and
/or
。
ℹ️ 注意:由于逻辑运算符的运算符优先级明显低于布尔运算符的运算符优先级,因此此嗅探器不包含自动修复器。
Universal.Operators.DisallowShortTernary
📊 📚
禁止使用短三元运算符?:
。
虽然短三元运算符在正确使用时很有用,但它们的原理通常被误解,并且它们往往被错误地使用,导致难以调试的问题和/或 PHP 警告/通知。
Universal.Operators.DisallowStandalonePostIncrementDecrement
🔧 📊 📚
- 禁止在独立语句中使用后增减量运算符 - 错误代码:
PostDecrementFound
和PostIncrementFound
。使用前增减量更符合最小惊讶原则,并且可以在稍后移动代码时防止错误。 - 不建议在独立语句中使用多个增减量运算符 - 错误代码:
MultipleOperatorsFound
。
Universal.Operators.StrictComparisons
🔧 📊 📚
强制使用严格比较。
⚠️ 警告:此嗅探器的自动修复器可能会导致应用程序出现错误,应谨慎使用!这被认为是一个风险修复器。
Universal.Operators.TypeSeparatorSpacing
🔧 📊 📚
强制执行在联合类型和交集类型操作符周围没有空格。
可用的错误代码有:UnionTypeSpacesBefore
、UnionTypeSpacesAfter
、IntersectionTypeSpacesBefore
和IntersectionTypeSpacesAfter
。
Universal.PHP.LowercasePHPTag
🔧 📊 📚
强制执行PHP开标签中的"PHP"为小写。
Universal.PHP.OneStatementInShortEchoTag
🔧 📚
禁止短开标签<?=
包含多个PHP语句。
Universal.UseStatements.DisallowMixedGroupUse
🔧 📊 📚
禁止在一条语句中导入命名空间/OO构造、函数和/或常量的组合使用语句。
注意:修复器将为组使用语句使用半标准化的格式。如果有更多特定于组使用语句格式的需求,规则集配置器应确保在规则集中包含额外的嗅探器以强制执行所需的格式。
Universal.UseStatements.DisallowUseClass
📊 📚
禁止使用导入use
语句对类/特性/接口/枚举进行导入。
可以通过包含特定的错误代码或允许包含整个嗅探器并排除特定的错误代码来禁止有/无别名、全局导入、来自同一命名空间的导入的子类型。
可用的错误代码有:FoundWithoutAlias
、FoundWithAlias
、FromGlobalNamespace
、FromGlobalNamespaceWithAlias
、FromSameNamespace
和FromSameNamespaceWithAlias
。
Universal.UseStatements.DisallowUseConst
📊 📚
禁止使用导入use
语句对常量进行导入。
有关错误代码的信息,请参阅Universal.UseStatements.DisallowUseClass
。
Universal.UseStatements.DisallowUseFunction
📊 📚
禁止使用导入use
语句对函数进行导入。
有关错误代码的信息,请参阅Universal.UseStatements.DisallowUseClass
。
Universal.UseStatements.KeywordSpacing
🔧 📊 📚
强制在use
、function
、const
关键字后面使用单个空格,并在导入use
语句中的as
关键字前后使用空格。
是PHPCS原生Generic.WhiteSpace.LanguageConstructSpacing
嗅探器的配套嗅探器,该嗅探器不涵盖在导入use
语句中使用时的function
、const
和as
关键字。
该嗅探器具有模块化错误代码,允许禁用单个检查。错误代码有:SpaceAfterUse
、SpaceAfterFunction
、SpaceAfterConst
、SpaceBeforeAs
和SpaceAfterAs
。
Universal.UseStatements.LowercaseFunctionConst
🔧 📊 📚
强制在导入use
语句中使用function
和const
关键字时始终为小写。
是PHPCS原生Generic.PHP.LowerCaseKeyword
嗅探器的配套嗅探器,该嗅探器不涵盖在导入use
语句中使用时这些关键字。
Universal.UseStatements.NoLeadingBackslash
🔧 📊 📚
验证在导入use
语句中导入的名称不以反斜杠开头。
导入use
语句中的名称应始终为完全限定,因此不需要前导反斜杠,并且强烈建议不要使用。
此嗅探器处理PHP支持的所有类型的导入使用语句,与PHPCS原生的PSR12
或Slevomat标准等嗅探器相比,这些嗅探器是不完整的。
Universal.UseStatements.NoUselessAliases
🔧 📚
检测导入使用语句中的无意义别名。
将某物别名为与原始构造相同的名称被认为是无意义的(尽管在PHP中是允许的)。注意:由于PHP中的OO和函数名称不区分大小写,使用不同的大小写将同名的别名也视为无意义。
Universal.WhiteSpace.AnonClassKeywordSpacing
🔧 📊 📚
标准化匿名类声明中class
关键字与开括号(如有)之间的间距。
- 此嗅探包含一个
spacing
属性,用于设置嗅探应检查的空格数量。接受值:(int)空格数。默认为0
(空格)。
Universal.WhiteSpace.CommaSpacing
🔧 📊 📚
强制执行逗号前没有空格,逗号后恰好有一个空格或一个换行。
此外,此嗅探还强制逗号应跟在代码后面,而不是跟在尾随注释后面。
对于间距部分,此嗅探有以下例外
- 逗号前面或后面有括号、花括号或方括号。这些将不会被标记,以防止与处理大括号周围间距的嗅探发生冲突。
- 逗号前面或后面有另一个逗号,例如在列表赋值中跳过项。这些将不会被标记。
- 当逗号后面有超过一个空格,然后是尾随注释时,此嗅探有一个单独的错误代码 -
TooMuchSpaceAfterCommaBeforeTrailingComment
。排除此错误代码以允许尾随注释对齐。 - 此嗅探使用的其他错误代码,即
SpaceBefore
、TooMuchSpaceAfter
和NoSpaceAfter
,可以带有上下文指示符 -*InFunctionDeclaration
、*InFunctionCall
、*InClosureUse
或*InDeclare
。这允许通过排除特定的后缀错误代码在任一上下文中禁用嗅探。 - 当决定如何处理heredoc/nowdoc终止符后的间距时,此嗅探将尊重可能设置的
php_version
配置选项。这实际上意味着,如果配置的PHP版本小于7.3,则此嗅探将强制在终止符和逗号之间有一个新行。如果没有传递php_version
,则此嗅探将根据是否是跨版本兼容的heredoc/nowdoc(强制新行)或灵活的heredoc/nowdoc(强制无空格)来处理heredoc/nowdoc终止符和逗号之间的间距。
Universal.WhiteSpace.DisallowInlineTabs
🔧 📚
强制使用空格进行中行对齐。
虽然制表符与空格的缩进是基于个人偏好的问题,但在中行对齐方面,应始终首选空格,因为使用制表符将导致根据开发人员选择的制表符宽度产生不一致的格式。
此嗅探对于基于制表符缩进的标准的特别有用,这些标准使用
Generic.Whitespace.DisallowSpaceIndent
嗅探来强制执行此操作。必须确保为PHPCS原生
tab-width
配置设置以获得最佳结果。<arg name="tab-width" value="4"/>PHPCS原生
Generic.Whitespace.DisallowTabIndent
嗅探(用于基于空格的标准)越界了其范围,并静默地将中行制表符转换为空格。然而,其姐妹嗅探Generic.Whitespace.DisallowSpaceIndent
对中行制表符/空格置之不理。此嗅探填补了这一空白。
Universal.WhiteSpace.PrecisionAlignment
🔧 📚
强制代码缩进始终是制表符倍数,即禁止精确对齐。
注意
- 此嗅探不涉及制表符与空格的比较。建议将此嗅探与PHPCS原生
Generic.WhiteSpace.DisallowTabIndent
或Generic.WhiteSpace.DisallowSpaceIndent
嗅探结合使用。 - 在使用此嗅探与基于制表符的标准一起时,请确保已设置
tab-width
,并且不要设置$indent
属性,或将其设置为制表符宽度(或其倍数)。 - 修复器基于“最佳猜测”工作,可能不会始终产生期望的缩进。请将此嗅探与
Generic.WhiteSpace.ScopeIndent
嗅探结合使用以进行更精确的缩进修复。
通过以下属性自定义嗅探的行为
indent
:用于代码库的缩进。接受值:(int|null) 空格数。默认为null
。如果此属性未设置,嗅探器将查找CLI的--tab-width
值。如果该值也没有设置,将使用默认的4
个空格的制表符宽度。ignoreAlignmentBefore
:允许提供一系列要忽略(前导)精度对齐的标记名称。接受值:(array) 标记常量名称。默认为空数组。使用示例<rule ref="Universal.WhiteSpace.PrecisionAlignment"> <properties> <property name="ignoreAlignmentBefore" type="array"> <!-- Ignore precision alignment in inline HTML --> <element value="T_INLINE_HTML"/> <!-- Ignore precision alignment in multiline chained method calls. --> <element value="T_OBJECT_OPERATOR"/> <element value="T_NULLSAFE_OBJECT_OPERATOR"/> </property> </properties> </rule>
ignoreBlankLines
:是否检查或忽略空白行上可能存在的潜在尾随空白。如果包含此嗅探器的标准不包括Squiz.WhiteSpace.SuperfluousWhitespace
嗅探器(这包含在大多数标准中),则建议只将其设置为false
。接受值:(bool)true
|false
。默认为true
。
贡献
欢迎对此项目做出贡献。克隆仓库,从develop
分支,进行更改,提交更改,并提交拉取请求。
如果您不确定您提出的更改是否受欢迎,请先打开一个问题来讨论您的建议。