【问题标题】:Rubocop Linelength: How to ignore lines with comments?Rubocop Linelength:如何忽略带有注释的行?
【发布时间】:2026-02-13 05:35:02
【问题描述】:

使用 Rails 4 应用程序时,我希望 Rubocop 在检查行是否过长时忽略带有 cmets 的行(只是注释或带有行尾注释的一些代码)。有没有办法做到这一点?

【问题讨论】:

    标签: ruby rubocop


    【解决方案1】:

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

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

    运行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
    

    您可以在其official manual 中阅读有关 RuboCop 的更多信息。

    要找到所有值得一看的规则名称in the rubocop config files

    cyberwiz 说 - “当我需要规则名称而不是查看文档时运行 rubocop -D。” 更新:现在这是没有标志的默认行为。

    -D 现在是默认值,所以我们现在可以“免费”获得它。

    【讨论】:

    • 嗯,cmets可能会解释与团队接受的风格的偏差,所以这不是一件坏事,对吧?否则你将它放在 rubocop.yml 文件中,然后它不是一个可接受的样式异常,并且不需要注释。评论说“我打算这样做!”。一点也不坏。
    • cmets 不是代码,因此检查它们在语义上是不同的,IMO rubocop 应该这样对待它。
    • 注释是代码的一部分,当您在电子邮件或终端上处理代码时。我认为不让您的 cmets 遵守“团队”采用的与代码相同的行长是不好的品味。他们不应该仅仅因为他们是 cmets 而扰乱流动。我确信 rubocop 不会在语义上(有意义地)检查除了指令之外的任何内容。它确实检查行长和 cmets 的样式。所以不,它不是在寻找意义,它只是在检查风格。不要小看“cmets 不是代码”不一定是这样。
    • 事实上,即使#!/bin/env ruby 注释行也是注释,但代码,并且在语义上很重要。评论并不总是只有“cmets”。
    • @Twiek 您正在寻找的这个答案有什么遗漏吗?
    【解决方案2】:

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

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

    这可以改进,以便“缩进”注释行(即空格后跟 # 字符)也被忽略,如果这是你想要的。

    请注意,这不包括以注释结束的代码行:

    some_code(that_does_something) # This line would NOT be ignored by Rubocop.
    

    【讨论】:

    • 您可以通过包含可以包含空格的行来扩展该正则表达式:IgnorePatterns: ['(\A|\s)#']
    • 谢谢 @poustovitss。有一个错字:应该是 IgnoredPatterns 而不是 IgnorePatterns(它缺少字母 'd')。
    • 我用过:IgnoredPatterns: ['^ *# '] 这允许使用任何缩进的全行 cmets。它不会忽略带有尾随 cmets 的代码,这是我的偏好。
    【解决方案3】:

    您可以在 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
    

    【讨论】:

    • 现在是# rubocop:disable Layout/LineLength
    【解决方案4】:

    我认为这里的基本思想是你想要强制行长,不管 n 个字符之后是什么。默认为 80 个字符是旧终端窗口的一些货物崇拜,只能容纳该数量的字符。我看到in the code 的唯一选项是允许可能超过字符限制的网址。

    你可以ignore whole files,我猜这不是你要找的。​​p>

    【讨论】:

    • 如今,80 chars 背后的想法对于终端来说已不再是“货物崇拜”,它仍然有一个合乎逻辑的原因:任何人都可以随意拆分他们的编辑器或 IDE 窗口,并且只要它们的宽度超过 80 个字符,就不需要更改宽度或体验换行。
    • IMO 如果您没有支持软包装的 IDE,则您的工具不是最新的。
    • 80 个字符也很可读,而 40 或 200 个字符则不太可读,所以这也是一个可用性问题
    • #1 “只要它们比 80 个字符宽” 800x600 比 80 个字符宽,并且您在查看并排 2 80 个字符文件时遇到同样的问题。这是废话,仅适用于1366 res。随着 1920+ 的接管,下一个参数将是“我可以拆分 3、4 个文件”
    • 我们原本是 80,然后将其更改为 120。在 13 英寸笔记本电脑上以分屏视图在 Github 上进行代码审查时查看 PR 成为一个问题。我们切换回 80。