3 个版本 (破坏性更新)
0.7.0 | 2024年4月4日 |
---|---|
0.6.0 | 2024年4月1日 |
0.5.0 | 2024年3月27日 |
#144 in 开发工具
92KB
2K SLoC
omnilinter
定义路径模式正则表达式规则,并一次性匹配所有你的仓库/项目/代码库。使用它来推广和保持良好的实践,跟踪弃用,并修复代码中的常见问题。
示例
% cat omnilinter.conf
[convert deprecated auto_ptr to unique_ptr]
files *.cpp
match /auto_ptr/
[convert setup.py to pyproject.toml]
files setup.py
nofiles pyproject.toml
[add license information]
files *.py *.c* *.h* *.rs
nomatch /^..? SPDX-FileCopyrightText:/
[add CI workflow]
files *.py *.c* *.h* *.rs
nofiles .github/workflows/*.yml
[add project README]
nofiles /README*
% omnilinter -c omnilinter.conf my_projects/*
my_projects/my_python_project
setup.py: convert setup.py to pyproject.toml
src/__init__.py: add license information
my_project/my_cpp_lib
add project README
add CI workflow
src/main.cpp: add license information
src/main.cpp:17: convert deprecated auto_ptr to unique_ptr
查看 omnilinter 自身的 配置 和 作者规则集 以获取更多示例。
运行
至少,您需要指定配置文件路径和要检查的目录路径
omnilinter -c <path to omnilinter.conf> <directory to check> ...
或者,如果您在配置中直接设置了要检查的目录,并将其放置在默认位置(~/.config/omnilinter/omnilinter.conf
),则可以仅运行
omnilinter
有用选项
--tags
,--skip-tags
- 限制操作为规则子集。--format by-root|full-paths|by-rule|by-path
- 指定输出格式。--color
,--palette
- 调整输出颜色。--error-exitcode
- 如果任何规则匹配,则退出指定的代码,对于 CI 和脚本非常有用。
有关所有选项,请参阅 omnilinter --help
。
配置文件格式
示例 omnilinter.conf
root /path/to/project1
root /path/to/other_projects/* # patterns are allowed
include /path/to/other.conf
[rule title]
tags tag1,tag2 # used with --tags, --exclude-tags
nofiles /README* !/README.txt # require absence of file
files *.py !*.pyi # or require presence of a file, in which...
match /Object/ !/^class / # ...require pattern match...
nomatch "^/usr/share/.*" # ...or absence of pattern match
[next rule]
...
文件开头允许配置指令
-
root
指定默认操作目录。这些目录仅在命令行上未指定根目录时使用。此处支持 Shell 模式。非绝对路径相对于配置位置解析。 -
include
解析额外的配置。此处也支持 Shell 模式,非绝对路径相对于配置位置解析。
接下来是规则集,其中每个规则由以下部分组成
-
括号标题,用于报告匹配项。如果您想在标题中包含闭合括号,请使用
]]
。所有其他部分都是可选的。 -
tags
指令,使用逗号或空格分隔的标签列表,以过滤使用--tags
和--exclude-tags
命令行选项的规则。 -
路径条件
- 需要目录中存在特定路径模式的
files
。 - 需要不存在这些模式的
nofiles
。
每个条件都需要一个或多个 shell 模式(例如,
*.py
或/src/*.c*
或**/tests/*.rs
)并允许排除(前缀为!
)。允许使用反斜杠转义和引号,就像在 shell 中一样(例如,"program output "\[[0-9]\].txt
匹配program output [1].txt
)。没有路径分隔符的样式匹配任何地方(*.py
匹配setup.py
和src/mymodule/__init__.py
),而带有路径分隔符的模式仅在相对于根目录的路径中匹配。 - 需要目录中存在特定路径模式的
-
内容条件(仅在
files
后允许,并且仅适用于该特定files
条件匹配的文件)match
需要在文件中匹配给定的正则表达式模式。nomatch
需要不存在这样的匹配。
这些条件需要一个或多个正则表达式,用括号(几乎)任何字符括起来(例如,
/.*/
,".*"
,|.*|
都可以工作,因此可以避免转义)并允许使用!
前缀的排除。size
使用运算符(>,
>=,
<,
,
=or
==,
!=or
<>) 对给定的字节数 (例如,) 大于等于 1024。
lines
以相同的方式检查行数。
您可以使用这些条件构建相当复杂的树,例如
[too big readme for such small rust library]
# match when there's src/lib.rs...
files src/lib.rs
# ...but no other .rs files under src/, which along with the
# previous condition suggest it's a single-file rust library
nofiles src/**/*.rs !src/lib.rs
# if there's README file of any kind,...
files /README*
# ...and it's longer than 25 lines...
lines >= 25
# ...unless there's Example: header (implied that it may contain a lot of code)
nomatch /^#* Example:/
当所有规则条件都满足时,报告规则匹配
README.md: too big readme for such small rust library
匹配可能包含上下文
- 如果规则中的最后一个条件是
match
,则将报告文件和行。 - 否则,如果最后一个 路径 条件是
files
,则将报告文件(如上面的示例所示)。 - 否则,没有特定的上下文,报告是对检查的目录的总体报告。
因此,规则顺序很重要,因此应首先指定预条件,然后指定指向具体问题地点的最后一个条件。
规则模板
具有特殊[!template]
标题的规则不是作为常规规则处理,而是指定了要添加到所有后续规则中的项(标签和条件)。这有助于减少重复。您可以通过指定没有任何项的无内容[!template]
规则来重置模板。
安装
从 cargo 或您的包仓库安装
cargo install omnilinter
作者
许可协议
依赖项
~6–19MB
~209K SLoC