1

デプロイするたびに Capistrano をデプロイに使用していると、Rails が JS および CSS アセットキャッシュ全体を再生成することがわかりました。これは、ファイルが更新されているかどうかに関係ありません。

1つまたは複数のファイルが更新された場合にのみ、Railsにこれを実行させる方法はありますか?

Capistrano で:normalize_asset_timestampsをオフにしたので、問題にはなりません。


私の主な問題は、すぐにこのアクションを実行するためにかなりの量のメモリを使用し、そのメモリを決して解放しないように見えることです。

前もって感謝します。

4

1 に答える 1

2

ファイルが存在しない場合は、Rails が作成します。Rails コードを開始する前に、キャッシュされた古いアセットを新しいディレクトリに scp することもできますが、capistrano はどのファイルが変更されたかについて賢明ではないので、いつこれを行うべきかわかりません。

あなたが説明したものとまったく同じものが必要な場合は、古い js/css ディレクトリと新しい js/css ディレクトリを md5sum して違いを探します。ある場合は、最初からビルドする必要があります。ない場合は、古いファイルを scp することができます。

または、メモリだけを気にする場合は、サーバーを起動する前にアセットを構築できます。何かのようなもの:

class AssetCache
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::AssetTagHelper

  APPLICATION_JAVASCRIPTS = %w{ mootools mycustom admin }

  def pre_cache
    javascript_include_tag JAVASCRIPT_ASSETS,
                           :cache => 'cache/app.js'
  end
end

そして、Rails デーモンを開始する前に cap でscript/runner -e production AssetCache.new.pre_cacheファイルを作成するために実行します。レイアウトでAssetCache::APPLICATION_JAVASCRIPTSは、ファイルのインライン リストの代わりに使用します。スタイルシートをすすぎ、繰り返し、洗います。Rails デーモンは既存のキャッシュを認識し、メモリを占有しません。

複数のサーバーを使用している場合は、タイムスタンプを変更せずに資産を複製する必要があるでしょう。

幸運を!

于 2009-07-22T12:53:04.817 に答える