如何配置Rubocop仅扫描bin/scripts子文件夹排除其余内容
问题说明
- 项目存在
bin目录,目录内包含其他子目录、顶层文件,以及需要保留扫描的bin/scripts子文件夹 - 需求:仅扫描
bin/scripts/**/*路径下的所有文件,忽略bin目录下其余所有内容 - 原有配置会无差别排除bin目录下全部内容,无法满足需求,原有配置如下:
AllCops: TargetRubyVersion: 3.1.2 NewCops: enable Exclude: - "bin/**/*"
问题原因
RuboCop的路径匹配规则中,Exclude优先级高于Include,直接配置bin/**/*会匹配bin目录下所有层级的文件,后续单独添加include规则也无法将排除的路径重新加入扫描范围。
解决方案
使用扩展glob的否定语法,排除bin目录下除scripts子目录外的所有内容即可,修改后的配置如下:
AllCops: TargetRubyVersion: 3.1.2 NewCops: enable Exclude: # 排除bin根目录下的所有顶层文件 - "bin/*" # 排除bin下除scripts目录外所有子目录的全部内容 - "bin/!(scripts)/**/*"
注:
!(pattern)是glob扩展语法,代表匹配除括号内指定模式之外的任意内容,RuboCop默认支持该语法。
如果你的RuboCop版本较旧不支持上述否定语法,可以用逐字符匹配的方式实现相同效果:
AllCops: TargetRubyVersion: 3.1.2 NewCops: enable Exclude: - "bin/*" - "bin/[^s]*/**/*" - "bin/s[^c]*/**/*" - "bin/sc[^r]*/**/*" - "bin/scr[^i]*/**/*" - "bin/scri[^p]*/**/*" - "bin/scrip[^t]*/**/*" - "bin/scripts?*/**/*"
这套规则会依次排除首字母不是s、首字母s第二个字母不是c、前两个字母sc第三个字母不是r……直到排除所有名字不是scripts、以及名字以scripts开头但长度更长的目录,最终只保留bin/scripts目录下的内容不被排除。
内容的提问来源于stack exchange,提问作者Indigo
相关产品推荐
相关产品推荐

