Reekを使用してfeature branch関連ファイルのcode smellをチェック

2122 ワード

TL;DR
最近RailsプロジェクトにReekというコード分析ツールを追加し、コードの悪い味をチェックしました.プロジェクトはもうしばらく時間があるので、走ると何百ものヒントがあります.普段はコードを最適化する手間もありません.そこで、feature branchで修正したファイルだけをチェックして、的確に最適化する方法を考えました.
構想
ほとんどのCLIのように、Reekは指定したファイルをチェックするために追加のパラメータを受け入れることもできます.次のようになります.
$ bundle exec reek file1 file2

一方、Gitのdiffは、2つのブランチに対する変更を比較することができ、1つのパラメータ--name-onlyを加えると、変更されたファイル名のみを出力することができる.以下では、現在のブランチがfeature branchであると仮定し、stagingブランチの場合を比較する.
# assume current branch is feature branch
$ git diff --name-only staging

file1
file2
...

私たちはrake taskを書くことができて、Rubyを通じてgit diff命令を呼び出して、帰ってきたファイル名を1行に変換して、reek命令に伝えることができます.目的を達成することができます.
インプリメンテーション
実装は簡単ですが、コードだけを入れます.
# lib/tasks/reek.rake
namespace :reek do
  desc "Check code smells for changed files (based on staging)"
  task :changed, [:branch] do |t, args| #     branch   
    branch = args[:branch] || 'staging'

    #         ,        
    re = `git diff --name-only #{branch}`
    files = re.split("
").delete_if { |name| !File.exist?(name) } if files.blank? puts "
No files changed
" return end # puts "
Reek changed files:" files.each do |file| puts " #{file}" end puts # reek system "bundle exec reek #{files.join(' ')}" end end

注意すべき点はいくつかあります.
  • このtaskはbranchパラメータで比較するブランチを修正することができ、簡単に表示できます.
  • は、git diffコマンドを呼び出して「`」を使用し、戻り値の取得を容易にする.
  • 呼び出しbundle exec reekは、出力を画面に表示する必要があるため、systemを使用しなければならない.

  • 簡単に使用できます.
    #     ,   staging      
    ./bin/rake reek:changed
    
    #    master   ,   commit   
    ./bin/rake reek:changed[master]

    小結
    コード分析ツールは良いもので、人のプログラミング習慣を暗黙的に変えることができ、経験のあるプログラマーでも欠陥を補う役割を果たすことができます.しかし、世の中には絶対性がなく、ルールがプロジェクトと一致しているかどうかを分析し、ワークフローがどのように改善されているかは、人によって異なり、絶えず考え、総括する必要があります.
    参考資料
    ReekCan I make git diff only show the changed file names and line numbers?