34

rubocop是 Ruby 的代码风格检查器。与 rubocop 类似的工具 Cane 可以与 Rake 集成。我更喜欢 rubocop 而不是 Cane,因为 rubocop 根据Ruby 样式指南进行检查,而且它似乎发现了更多问题。为了自动化样式检查过程,我想将 rubocop 与 Rake 集成,以便在缺乏代码质量时构建失败。

Gem 已经支持通过 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
4

6 回答 6

77

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

require 'rubocop/rake_task'

RuboCop::RakeTask.new

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

于 2013-11-25T20:53:48.813 回答
33

我强烈推荐,

require 'rubocop/rake_task'

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

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

于 2016-11-11T17:17:49.283 回答
3

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

于 2013-05-04T21:42:14.210 回答
1

我需要自己做类似的事情,最后查看了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)
于 2021-04-07T15:35:52.067 回答
-3

您可以通过 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']
于 2014-09-09T04:48:56.317 回答
-13

我会建议炮轰 rubocop 程序。这是最简单的解决方案。只需将其添加到您的 Rakefile 中:

task test: :rubocop

task :rubocop do
  sh 'rubocop'
end
于 2013-02-24T21:52:37.840 回答