Railsガイド生成時に古い出力ファイルを削除する仕組みを追加
Rails 8.1では、ガイド生成時に出力ディレクトリ内の古いHTMLファイルを自動削除する機能が追加されました。これにより、リネームや削除されたガイドの残骸がサイトに残り続ける問題が解消されます。
背景
#56232で報告されていた通り、ガイドファイルがリネームされたり削除されたりしても、以前に生成されたHTMLファイルが出力ディレクトリに残り続けていました。これらの古いファイルは依然としてアクセス可能で、検索エンジンにインデックスされてしまうという問題がありました。
技術的な変更
cleanup_assetsメソッドに、HTMLファイルを削除する処理が追加されました。
変更前:
def cleanup_assets
FileUtils.rm_rf(Dir.glob("#{@output_dir}/{stylesheets,javascripts}"))
end
変更後:
def cleanup_assets
FileUtils.rm_f(Dir.glob("#{@output_dir}/*.html"))
FileUtils.rm_rf(Dir.glob("#{@output_dir}/{stylesheets,javascripts}"))
end
この変更により、新しいガイドを生成する前に、出力ディレクトリ内の全HTMLファイルが削除されます。CSSやJavaScriptファイルは従来通り削除されます。
テストの追加
今回のPRでは、ガイド生成機能の初めてのテストケースも追加されました。guides/test/generator_test.rbが新設され、以下の動作を検証しています:
test "generate creates new files and removes stale html/css/js files" do
Dir.mktmpdir do |guides_dir|
# 一時ディレクトリでテスト環境を構築
output_dir = File.join(guides_dir, "output")
# 古いファイルを配置
stale_html = File.join(output_dir, "stale_test_guide.html")
FileUtils.touch(stale_html)
# ガイドを生成
# ...
# 古いHTMLファイルが削除されていることを確認
assert_not File.exist?(stale_html)
end
end
テストでは実際のガイドファイル(getting_started.mdなど)をコピーし、一時ディレクトリで完全なガイド生成プロセスを実行しています。
設計判断
rm_rf(再帰的削除)ではなくrm_f(ファイル削除のみ)を使用している点が注目されます。これは出力ディレクトリ直下のHTMLファイルのみを対象とし、サブディレクトリ(images/など)の内容は保持する設計です。
また、initialize_dirsメソッドにguides_dirパラメータが追加され、テスト時に任意のディレクトリを指定できるようになりました。これにより、実際のガイドディレクトリを汚染せずにテストが実行可能になっています。