web-dev-qa-db-ja.com

プリコンパイルされたアセットが開発モードで提供されないようにする方法は?

開発モードでJavaScriptファイルを連結するのではなくnotを好みますが、個別のファイルとして提供します。だから私は設定しました:

development.rb:

config.assets.compress = false
config.assets.debug = true
config.assets.compile = true

/ app/assets/javascriptディレクトリには次のものがあります。

  • reviews.js
  • レビュー/
    • foo.js
    • bar.js

reviews.js:

//= require jquery
//= require jquery_ujs
//= require_tree ./reviews

レイアウトに<%= javascript_include_tag "reviews" %>を使用してJavaScriptを含めます。生成されたページは3つのスクリプトを個別に正しく参照し、reviews.jsは本質的に空です。ここまでは順調ですね。

rake assets:precompileを使用して本番用にアセットをプリコンパイルすると、3つのJavaScriptファイルがreviews.jsに連結されます。これは本番環境ではすべて問題ありませんが、開発モードでは、連結されたreviews.jsが提供されます追加 2つの個別のファイル。

もちろん、これにより、開発時にあらゆる種類の厄介なバグが発生します。なぜなら、今ではfoo.jsbar.jsのコンテンツが2回提供され、そのうちの1つはreviews.jsの古いバージョンです。

Railsが開発モードでプリコンパイル済みアセットを使用しないようにするにはどうすればよいですか?

53
Ortwin Gentz

ローカルでプリコンパイルしているようです。ファイルは予想される場所に存在するため、開発サーバーによって処理され、リクエストはスプロケットに送信されません。

これを停止する唯一の方法は、コンパイルされたファイルを削除することです。

通常、ローカルでコンパイルする必要はありません。ほとんどすべての場合、アプリの展開中にプリコンパイルタスクが実行されることが予想されます。アセットパイプラインガイドページに、このためのCapistranoレシピがあります。

これらのファイルをリポジトリにローカルにコミットする必要がある場合は、ブランチを使用して問題を回避できます。マスターブランチを運用コード用に予約し、dev用の2番目のブランチを作成します。マスターでのみアセットをコンパイルおよびコミットします。 devに切り替えると、それらはなくなります。必要に応じて、devをmasterにマージします。

編集:ブラウザーを強制的に更新する(Ctrl + F5)ことを確認してください。そうしないと、ブラウザーのキャッシュから古いアセットが使用されていることがあります。

53
Richard Hulse

config/environments/development.rb セットする:

config.assets.prefix = "/assets_dev"

そのためdevelopment mode Railsはそこを探します(ただし、開発中のアセットをコンパイルしないため、何も見つかりません)行う-アセットをコンパイルしない))。

production用にプリコンパイルするときは、

Rails_ENV=production rake assets:precompile

そのため、デフォルトのアセットフォルダーpublic/assets

80
Haim Lankry

config/environments/development.rbセット:

config.serve_static_assets = false

/publicのファイルは提供されません

17
Peter Madsen

これを試してみたところ、うまくいきました。 rake assets:precompile Rails_ENV=production

新しいバージョンのアセットパイプラインは、rake assets:precompilerake assets:precompile:all

1
Uchenna