【问题标题】:Rails - Rake test and rubocop in one taskRails - 在一项任务中进行 Rake 测试和 rubocop
【发布时间】:2026-02-23 06:45:02
【问题描述】:

我正在尝试设置我的 rails 项目,以便贡献者所需的所有验证都在一个命令中,目前我们一直在运行:

rake test

但现在我们也想使用 rubocop 进行静态分析:

rubocop -R -a

我希望它可以在一个简单的 rake 任务中执行。覆盖 'rake test' 来运行 rubocop 然后是 rails 项目的标准 rake 测试东西会很好,因为这样就没有人需要记住更改命令。但如果我必须创建一个单独的 rake 任务,那也可能没问题。

我已经看到了 rubocop rake 集成 here, at the bottom,但我不确定如何将它与“rake 测试”捆绑到一项任务中......有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby rake static-analysis rubocop


    【解决方案1】:

    我更喜欢将我的默认任务设置为运行 rubocop,然后运行测试。无论哪种方式,最好将这些任务分开而不是让一个任务做两件事。

    require 'rubocop/rake_task'
    
    task :default => [:rubocop, :test]
    
    desc 'Run tests'
    task(:test) do
      # run your specs here
    end
    
    desc 'Run rubocop'
    task :rubocop do
      RuboCop::RakeTask.new
    end
    

    你的任务:

    > rake -T
    rake rubocop  # Run rubocop
    rake test     # Run tests
    

    【讨论】:

    • 如何向 RuboCop 提供参数?
    【解决方案2】:

    这是我最终得到的 .rake 文件。

    desc 'Run tests and rubocop'
    task :validate do
      Rake::Task['rubocop'].invoke
      Rake::Task['test'].invoke
    end
    
    task :rubocop do
      require 'rubocop'
      cli = Rubocop::CLI.new
      cli.run(%w(--rails --auto-correct))
    end
    

    【讨论】:

    • 在没有所有 Rake 细节的情况下,也可能在 Thorfile 中使用它。
    【解决方案3】:

    您可以轻松定义自己的 rake 任务,它首先调用 Rails 的 test rake 任务,然后是您为 rubocop 提到的代码 sn-p。

    例如,在 .rake 文件中,您可以有类似的内容:

    require 'rubocop/rake_task'
    
    desc 'Run tests and rubocop'
    task :my_test do
      Rake::Task['test'].invoke
      RuboCop::RakeTask.new  
    end
    

    如果您觉得需要自定义对 Rubocop 的调用并且涉及更多代码,您可以创建另一个自定义任务,例如 :rubocop,然后您也可以从 :my_test 调用它。

    最后,创建您自己的 rake 任务并坚持使用 rake test 的替代方法是修改您的 test_helper 以在测试完成后调用您需要调用的任何内容。

    【讨论】:

    • 谢谢,效果很好,已经把最后的事情作为答案
    【解决方案4】:

    它似乎已经从:

    Rubocop::RakeTask.new

    到:

    RuboCop::RakeTask.new

    看到妈妈了吗?我知道如何使用 CamelCase!

    【讨论】:

      【解决方案5】:

      我使用以下 .rake 文件同时运行测试和 rubocop 任务:

      task default: %w[rubocop test]
      
      RuboCop::RakeTask.new(:rubocop) do |task|
        task.patterns = ['**/*.rb']
        task.fail_on_error = false
        task.options = ["--auto-correct-all"]
      end
      
      task :test do
        ruby 'test/program_test.rb'
      end
      

      第一行允许通过调用rake 来运行这两个任务。

      命令行参数也可以添加到options数组中。

      【讨论】: