[Rails 5] rails dev:cacheコマンドでdevelopmentモードでのキャッシュを簡単にオン・オフできる

こんにちは、hachi8833です。BigBinaryシリーズ、今回はRails 5でdevelopmentモードのキャッシュを簡単にオンオフできる機能を紹介します。 元記事 Caching in development environment in Rails 5(米国BigBinary社のブログより) 確認に使った環境 Railsバージョン: 5.0.2(5.0-stable) Rubyバージョン: 2.4.0p0 Rails 5の新機能: developmentモードのキャッシュを簡単に制御できるようになった Rails 4まで Rails 4までは、developmentモードのキャッシュを切り替えるためにいちいちconfig/environments/development.rbを開いて以下の設定のfalse/trueを切り替え、さらにサーバーを再起動しなくてはなりませんでした。 config.action_controller.perform_caching = false ローカルキャッシュの動作を調べたりするときに地味に面倒です。 Rails 5以降 Rails 5では、developmentモードのキャッシュを簡単に作成できる新しいコマンドが導入されました。これにより、キャッシュの動作を切り替えて振る舞いの違いを簡単に確認できます。DHHの要請で追加された機能です。 Issue: #18875: rake dev:cache Pull Request: #20961: Add dev caching toggle / server options 訳注: Rails 5.0.2のconfig.action_controller.perform_cachingのデフォルト設定は以下のとおりです。 development: false(tmp/caching-dev.txtがある場合のみtrue) production: true test: false $ rails dev:cache Development mode is now being cached. 上のようにrails dev:cacheコマンドを実行すると、tmp/ディレクトリにcaching-dev.txtファイルが作成されます。 キャッシュの仕組み Rails 5で新規作成したRailsアプリでは、config/environments/development.rbに以下のコードが含まれるようになりました。以下は5.0.2で確認しました。 # Enable/disable caching. By default caching is disabled. if Rails.root.join(‘tmp/caching-dev.txt’).exist? config.action_controller.perform_caching = true config.cache_store = :memory_store config.public_file_server.headers = { ‘Cache-Control’ => ‘public, max-age=172800’ } else config.action_controller.perform_caching = false config.cache_store = :null_store end このコードでは、tmp/caching-dev.txtが存在する場合にのみ:mem_cache_storeでキャッシュを有効にします。 以下は当時のdev_cacheコマンドのソースです。 def dev_cache if File.exist? ‘tmp/caching-dev.txt’ File.delete ‘tmp/caching-dev.txt’ puts ‘Development mode is no longer being cached.’ else FileUtils.touch ‘tmp/caching-dev.txt’ puts ‘Development mode is now being cached.’ end FileUtils.touch ‘tmp/restart.txt’ end 訳注: ただしその後コードがさらに変わり、現在はモジュールとしてrailties/lib/rails/dev_caching.rbにあります。 require “fileutils” module Rails module DevCaching # :nodoc: class << self FILE = “tmp/caching-dev.txt” def enable_by_file FileUtils.mkdir_p(“tmp”) if File.exist?(FILE) delete_cache_file puts “Development mode is no longer being cached.” else create_cache_file puts “Development mode is now being cached.” end FileUtils.touch “tmp/restart.txt” FileUtils.rm_f(“tmp/pids/server.pid”) end def enable_by_argument(caching) FileUtils.mkdir_p(“tmp”) if caching create_cache_file … Continue reading [Rails 5] rails dev:cacheコマンドでdevelopmentモードでのキャッシュを簡単にオン・オフできる