22
14

More than 1 year has passed since last update.

【Tips】ローカルで `rails assets:precompile` を実行してしまい以後アセットの更新が反映されなくなってしまった場合の対応

Last updated at Posted at 2023-05-24

発生した問題

 Rails に React を組み合わせて利用した時に、erb ファイルを更新した場合はクライアントの表示が変化するが、jsx ファイルを更新しても表示が変化しない。

環境

  • OS
    • Windows 11
    • WSL2
      • Ubuntu 20.04 LTS
  • 言語
    • Ruby 3.2.2
    • Node 16.14.0
  • ライブラリ
    • Rails 7.0.4.3
    • jsbundling-rails 1.1.1
    • esbuild 0.14.22

備考

  • Rails 7 なので rails s ではなく bin/dev コマンドでサーバを起動。
  • 過去に rails assets:precompileを実行済み。

原因

 rails assets:precompile 実行後に作成されるプリコンパイル済みのアセットが存在する場合、表示においてそちらが優先される。これはプリコンパイル前のアセット(CSSやJavascript)が更新されてもそれらは無視されることを意味する。

以下はアセットパイプライン - Rails ガイドからの引用。

プリコンパイル済みのアセットが配信可能な状態になっていると、元の(コンパイルされていない)アセットと一致していなくてもプリコンパイル済みのアセットが配信されてしまいます。これはdevelopmentサーバーでも同じことが起きます。

developmentサーバーが常にアセット変更のたびにオンザフライでコンパイルし、常に最新のコードが反映されるようにするには、development環境ではproductionと異なるディレクトリにプリコンパイル済みアセットを保存する設定が必要です。そうしないと、production用のプリコンパイル済みアセットがdevelopment環境でのブラウザ表示に影響を与えてしまいます(つまりアセットを変更してもブラウザに反映されなくなります)。

解決策

概要

rails assets:precompile で生成されたコンパイル済みのassetsを削除すればよい。

方法1

以下のコマンドを実行。

rails assets:clobber

方法2

以下のコマンドを実行した後にpublic/assets ディレクトリを丸ごと削除する。

rails assets:clean

補足

方法2で利用する以下のコマンドだけでは解決しなかった。

rails assets:clean

コマンドを実行すると以下のように表示されコンパイル済みアセットが削除される表示が出る。

$ rails assets:clean
I, [2023-05-24T16:38:31.501191 #1129]  INFO -- : Removed application-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.js
I, [2023-05-24T16:38:31.501828 #1129]  INFO -- : Removed application.js-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.map

しかし、public/assets ディレクトりが残っている限り依然更新は反映されなかった。

公式ドキュメントには「古いコンパイル済みのアセットを削除」とあるので、現在利用しているコンパイル済みアセットは残るものと推定される。

参考文献

本記事の元になった Chat-GPT とのやり取り

質問

Railsのローカルで rails assets:precompile を実行してしまうと、precomile済みアセットが配置され、以後development環境でもprecompile済みアセットの表示が優先されることで更新が反映されなくなるようです。上記を実行してしまった際に配置されたprecompile済みアセットはどのように削除できますか?

回答

Railsのprecompile済みアセットを削除するには、以下の手順を実行します。

  1. precompile済みアセットの削除: public/assets ディレクトリ内にあるprecompile済みアセットを削除します。ターミナルでプロジェクトのルートディレクトリに移動し、以下のコマンドを実行します。

    rm -rf public/assets
    

    このコマンドは public/assets ディレクトリを再帰的に削除します。

  2. マニフェストファイルのリセット: precompile済みアセットの情報を保持しているマニフェストファイル(public/assets/manifest.json)も更新する必要があります。マニフェストファイルを削除するか、中身を空にします。ターミナルでプロジェクトのルートディレクトリに移動し、以下のコマンドを実行します。

    rm public/assets/manifest.json
    

    または

    echo '{}' > public/assets/manifest.json
    

    2つ目のコマンドは、空のマニフェストファイルを作成します。

これでprecompile済みアセットと関連する情報が削除され、以降の開発環境では更新が反映されるようになります。

補足

試した事例では2つ目の回答に対応する処理は行わずとも解決した。

また、rails assets:clobber の事は教えてもらえなかったのであまり知名度がないのかもしれない。コマンド名で検索してもほとんど記事がヒットしない。

22
14
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
22
14