【问题标题】:How to integrate rubocop with Rake?如何将 rubocop 与 Rake 集成?
【发布时间】:2013-02-07 03:50:38
【问题描述】:

rubocop 是 Ruby 的代码样式检查器。与 rubocop 类似的工具 Cane 可以是 integrated with Rake。我更喜欢 rubocop 而不是 Cane,因为 rubocop 根据Ruby Style Guide 进行检查,而且似乎是spot more problems。为了自动化样式检查过程,我想将 rubocop 与 Rake 集成,以便在代码质量不足时构建失败。

Gem 已经支持 adding tests 通过 Rake 打包。我想对样式检查做同样的事情,以便样式检查与测试一起运行。我该怎么做?

如果从 Rakefile 开始有帮助的话,这里是一个:

# -*- coding: utf-8; mode: ruby -*-

require 'bundler/gem_tasks'
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test'
  t.test_files = FileList['test/unit/test*.rb']
end

desc 'Run tests'
task default: :test

【问题讨论】:

    标签: ruby coding-style rake rubocop


    【解决方案1】:

    我会推荐使用 rubocop 程序。这是最简单的解决方案。只需将其添加到您的 Rakefile:

    task test: :rubocop
    
    task :rubocop do
      sh 'rubocop'
    end
    

    【讨论】:

    • 下面的解决方案可能更好——使用RuboCop::RakeTask
    【解决方案2】:

    如果您使用 Guard 进行 RSpec 测试,您可能会发现 https://github.com/yujinakayama/guard-rubocop 很有用。它使 Rubocop 能够在您保存文件以及测试结果后立即为您提供反馈。

    【讨论】:

      【解决方案3】:

      从版本0.10.0 rubocop 包含您可以使用的自定义 rake 任务。只需将以下内容放入您的Rakefile

      require 'rubocop/rake_task'
      
      RuboCop::RakeTask.new
      

      确保使用大写的“R”和“C”,否则会出现 NameError。

      【讨论】:

      • rake-task的代码可以在GitHub找到
      【解决方案4】:

      您可以通过 Rake 选择您喜欢的选项:

        desc 'Run Rubocop with options'
        task rubocop: :environment do
          sh 'bundle exec rubocop -D --format offenses --format progress || true'
        end
      

      然后我建议修改默认任务以包含输出。诀窍是清除任务,然后添加您想要的内容。注意需要以|| true 结尾,这样来自 Rubocop 的错误不会阻止下一个任务运行。这就是我所做的,它也使用并行测试:

      task(:default).clear.enhance ['parallel:parallel_prepare', 'parallel:spec',
                                    'parallel:features', 'lint:rubocop',
                                    'lint:rails_best_practices']
      

      【讨论】:

        【解决方案5】:

        我强烈推荐,

        require 'rubocop/rake_task'
        
        RuboCop::RakeTask.new(:rubocop) do |t|
          t.options = ['--display-cop-names']
        end
        

        这使用了 rubocop 自己的 rake 任务,并允许您根据需要传递选项。

        【讨论】:

          【解决方案6】:

          我需要自己做类似的事情,最后在这里查看RuboCop::RakeTask的内部源代码:

          https://github.com/rubocop/rubocop/blob/a34a1c2c2dd1fa6d90ffd06c183421a495a0717c/lib/rubocop/rake_task.rb#L40-L43

                require 'rubocop'
          
                cli = CLI.new
                puts 'Running RuboCop...' if verbose
                result = cli.run(options)
                abort('RuboCop failed!') if result.nonzero? && fail_on_error
          

          您实际上可以在自己的代码库/rake 任务中直接调用类似的代码。

          我最终编写了一个可以调用的小包装模块,并带有一些我一直希望应用的默认标志:

          module RubocopCli
            def self.run!(*args)
              require "rubocop"
              cli = RuboCop::CLI.new
              result = cli.run(["--display-cop-names", "--force-exclusion", "--fail-level", "autocorrect", *args])
              raise "RubocopCli.run! Linting failed." if result.nonzero?
            end
          end
          

          然后您可以使用任何任务或应用代码中的附加参数调用它,例如:

          files_to_lint = %w[lib/whatever.rb spec/lib/whatever_spec.rb]
          RubocopCli.run!("--auto-correct", *files_to_lint)
          

          【讨论】:

            猜你喜欢
            • 2012-10-14
            • 2023-03-29
            • 1970-01-01
            • 2011-05-14
            • 1970-01-01
            • 2020-05-14
            • 2016-01-26
            • 2010-09-23
            • 2015-08-02
            相关资源
            最近更新 更多