LoginSignup
2
2

More than 5 years have passed since last update.

RailsのつかわれていないXXをどうにかする

Posted at

XXは使ってないファイルであったり、modelだったり、メソッドだったり

経緯

コンパイル言語じゃないと、今は使ってないファイルやクラスなど、
適切な消すタイミングを逃すと、消すのが難しい。(消していいのか調べるのだるい)
(適切な開発フローを行っていればいいのだけれど、限界がある)

仕組みを簡単に説明

使ってないファイルがあった場合、git grepなどして、ヒットしなかったら消すっていう運用を
だれでも一度はやったことあるとおもいますが、それをrspecなどでチェック出来るようにする。
動的にファイル名やその他を扱っている場合は上記の限りでないので、ホワイトリストを作って例外はそこで
管理する。

ついでに同じロジックで削除スクリプトも書く。

※運用の前提

継続的デリバリー的なものを実施している。
既存のものは一気に削除してリリースしない。少しずつ。

用意するもの

rspec周り

spec/non_used_files_spec.rb
require "rails_helper"

# この例では使ってない画像ファイルだけれども、sedやawkなど組み合わせて使ってないメソッドや、
# 使ってないXXってのをチェックできるとおもう(投げやり)
describe "使ってないファイル" do
  context "image編" do
    let(:target_path) {"app/views app/assets/stylesheets app/assets/javascripts used_files_whitelist.text"}
    it "使ってないimageがない" do
      files = Dir.glob("app/assets/images/**/*.*").map do |f|
        [f, f.split("/").last]
      end
      result = []
      files.each do |path, file_name|
        result << path if git_grep_e(file_name, target_path).empty?
      end
      expect(result).to be_empty
    end
  end
end
spec/support/git_grep.rb
module GitGrep
  def git_grep_e(pattern, *path)
    cmd = "git grep --line-number -e '#{pattern}'"
    cmd = "#{cmd} -- #{path.join(" ")}" unless path.empty?
    `#{cmd}`.split("\n")
  end
end
spec/rails_helper.rb
RSpec.configure do |config|
  # ↓追記
  config.include GitGrep
end
used_files_whitelist.text
banner01.png
banner02.png
banner03.png
banner04.png
banner05.png
banner06.png
banner07.png

意図としては検出できない、動的にソースコード内で記述しているものを書いておく
たとえば↓的な記述の場合など
(1..7).each do |i|
 = image_tag "banner0#{i}".png

削除スクリプト

上記のrspecでは実際の開発中に使わなくなったもののチェックができるという意図
既存の大量にあるつかわれてないimage fileを消すスクリプト
400近くあった(汗)、ちゃんと消そうよ。。

script/remove_non_use_images.rb
def git_grep_e(pattern, *path)
  cmd = "git grep --line-number -e '#{pattern}'"
  cmd = "#{cmd} -- #{path.join(" ")}" unless path.empty?
  `#{cmd}`.split("\n")
end

target_path = "app/views app/assets/stylesheets app/assets/javascripts used_files_whitelist.text"
files = Dir.glob("app/assets/images/**/*.*").map do |f|
  [f, f.split("/").last]
end
files.each do |path, file_name|
  if git_grep_e(file_name, target_path).empty?
    puts path
    `rm #{path}`
  end
end

参考URL

コードを改善する3つの方法

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2