Rubocop行长度:如何忽略带有注释的行?

165

我希望Rubocop在检查一行代码是否过长时,能够忽略带有注释的行(仅包含注释或是带有行尾注释的代码)。是否有方法可以实现这一点?

5个回答

284

有一种方法可以逐行忽略警察。

还有一种方法是通过配置文件来实现。

运行rubocop --auto-gen-config命令,它会生成一个文件,您可以使用该文件来禁用违规行为。

该命令还提示如何加载这些选项。

您也可以逐行启用和禁用警察。

# rubocop:disable RuleByName
This is a long line 
# rubocop:enable RuleByName

你可以在代码中同时执行多个规则。

# rubocop:disable BlockComments, AsciiComments

通过使用内联指令,该指令仅对该行有效,它的样子会是这样:

# Thanks to @jnt30 for the comment!
method(argument) # rubocop:disable SomeRule, SomeOtherRule

您可以在其官方手册中了解有关RuboCop的更多信息。

要查找所有规则名称,值得在rubocop配置文件中查看

cyberwiz表示 - “需要规则名称时运行rubocop -D而不是在文档中查找。” 更新:这现在是默认行为,无需标志。

-D现在是默认设置,因此我们现在可以“免费”获取它。


1
好的,注释可以解释为什么代码风格与团队所接受的不同,所以这并不是一件坏事,对吧?否则,你可以将它放在rubocop.yml文件中,那么它就不是一个被接受的风格异常,也不需要注释。注释说“我本来就是想这样做的!”这一点一点都不糟糕。 - vgoff
2
注释并非代码,因此检查它们在语义上与代码不同,在我看来 rubocop 应该区分对待。 - phoet
2
注释是代码的一部分,当你在电子邮件或终端上处理代码时,如果你的注释不遵循“团队”所采用的相同行长度,我认为这是不好的品味。它们不应该因为是注释而破坏流程。我确信rubocop不会检查注释除了指令和语义(有意义)之外的任何内容。它确实检查行长度和注释的风格。所以,不,它不是在寻找含义,它只是检查风格。不要忽视“注释不是代码”的事实。 - vgoff
1
另外需要注意的是,您还可以通过在行末添加排除项来使用“内联”禁用,这样您就不必再次启用它。这样做只会禁用给定行的规则,而不是其后面的所有规则。 - jnt30
1
@Twiek,你是否还需要其他的信息? - vgoff
显示剩余4条评论

49

可以在rubocop.yml中定义正则表达式模式,自动忽略某些行,因此您可以选择忽略所有以#字符开头的行:

Layout/LineLength:
  Max: 80
  AllowedPatterns: ['\A#']

或者:

Layout/LineLength:
  Max: 80
  AllowedPatterns:
    - !ruby/regexp /\A#/

这可以进一步改进,以便忽略“缩进”的注释行(即紧随空格后跟随一个#字符),如果您需要的话。例如:
Layout/LineLength:
  Max: 80
  AllowedPatterns:
    - !ruby/regexp /\A *# /

请注意,这并不考虑以注释结尾的代码行:
some_code(that_does_something) # This line would NOT be ignored by Rubocop.

13
您可以通过包括可能有空格的行来扩展该正则表达式: IgnorePatterns: ['(\A|\s)#'] - poustovitss
3
谢谢@poustovitss。有一个拼写错误:应该是IgnoredPatterns而不是IgnorePatterns(缺少字母“d”)。 - Horacio
3
我使用了:IgnoredPatterns: ['^ *# '] 这允许任何缩进的全行注释。它不会忽略带有尾随注释的代码,这是我的首选。 - David Hempy
2
警告:在 .rubocop.yml 中发现过时的参数 IgnoredPatterns(用于 Layout/LineLength)。IgnoredPatterns 已更名为 AllowedPatterns。<- 适用于最新版本 - dcangulo
1
@DavidCruwys 同感!非常令人困惑。 - courtsimas
显示剩余2条评论

24
可以使用以下rubocop注释来忽略特定规则:
# rubocop:disable Layout/LineLength
def this_could_be_a_very_long_line_that_extends_forever_into_infinity
end
# rubocop:enable Layout/LineLength

您还可以通过将文件添加到.rubocop.yml来忽略整个文件:

AllCops:
  Exclude:
    - path/to/file.rb

2
现在是 # rubocop:disable Layout/LineLength - Yathi

5
我认为这里的基本想法是,无论在n个字符后是什么,您都希望强制执行行长度。默认的80个字符是一些旧终端窗口的迷信,这些窗口只能容纳那么多字符。我在代码中看到的唯一选项是允许超过字符限制的URL的选项
您可以忽略整个文件,我猜这不是您要找的内容。

8
现在,80个字符的理念并不是为了跟随终端的“物质崇拜”,而是有一个合理的原因:任何人都可以根据自己的需求调整编辑器或IDE窗口的大小,只要宽度大于80个字符,就不需要改变宽度或进行自动换行。 - Jason Antman
2
在我看来,如果你没有一个支持软换行的集成开发环境,那么你的工具不是最新的。 - phoet
8
80个字符的阅读体验非常好,而40或200个字符的阅读体验就差一些,因此这也关乎用户体验。 - Toni Leigh
只要它们比80个字符宽,800x600就比80个字符宽,而且您在并排查看2个80个字符文件时会遇到相同的问题。这是无稽之谈,仅适用于1366分辨率。随着1920+的普及,下一个论点将是“我可以分割3、4个文件”。 - Andre Figueiredo
“80个字符也很容易阅读,而40或200个字符则不太容易。”这是另一种常见的草人论证,实际上100个字符是非常合适的。通常情况下,100个字符可以有10个空格,您可以进行分割、换行,键盘上还有HOME/END键,您有许多Diff插件/工具可供选择... - Andre Figueiredo
1
我们把它设为80,然后改成了120。在13英寸的笔记本电脑上使用分屏视图查看Github上的PR时成为了一个问题。我们又切换回了80。 - AndreiMotinga

0

以下配置对我有效:

Layout/LineLength:
  AllowedPatterns: ['^(\s*#)']

这个正则表达式只有在整行被注释掉的情况下才能工作。在同一行上跟随长注释的代码仍然会触发 Rubocop 的 lint 错误,这是设计上的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接