15

私の開発サンドボックスで

RAILS_ENV=production rake assets:precompile

完了までに 4 分以上かかります。これは正常ですか。heroku では、ジョブを実行するのに 10 分以上かかり、タイムアウトになることもあります。これを分析および/または高速化する方法はありますか?

アップデート

コンパイルの CSS と JS のフェーズをプロファイリングしました

3.7 s        js
175 s            css

数値は、ここで計測することによって作成されました

----------------------
/Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
----------------------
266     # Assign a compressor to run on `application/javascript` assets.
267     #
268     # The compressor object must respond to `compress` or `compile`.
269     def js_compressor=(compressor)
270       expire_index!
271  
272       unregister_bundle_processor 'application/javascript', :js_compressor
273       return unless compressor
274  
275       register_bundle_processor 'application/javascript', :js_compressor do |context, data|
276  
277         timeit "js" do
278           compressor.compress(data)
279         end
280  
281       end
282     end

    ----------------------
    /Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
    ----------------------
    241  
    242     # Assign a compressor to run on `text/css` assets.
    243     #
    244     # The compressor object must respond to `compress` or `compile`.
    245     def css_compressor=(compressor)
    246       expire_index!
    247  
    248       unregister_bundle_processor 'text/css', :css_compressor
    249       return unless compressor
    250  
    251       register_bundle_processor 'text/css', :css_compressor do |context, data|
    252         timeit "css" do
    253           compressor.compress(data)
    254         end
    255       end
    256     end

timeit呼び出しは、タイミングを行う追加ビットです

def timeit context
  s = Time.now
  yield.tap do 
    e = Time.now
    d = e - s
    puts "#{d*1000}\t #{context}"
  end
end
4

4 に答える 4

3

ハケティハックの解決策は、標準のsass圧縮エンジンを邪魔にならないようにモンキーパッチすることのようです。これを私のapplication.rbの一番上に追加しました

module Sass
  module Rails
    class CssCompressor
      def compress(css)
        css
      end
    end
  end
end

ファイル サイズの違いは、モンキー パッチの適用前は 124k、適用後は 125k で、桁違いに速度が向上しました。

于 2012-03-16T22:37:48.973 に答える
1

最適なオプションは、ローカルでコンパイルし、通常どおりコミットしてデプロイし、本番用のプリコンパイル タスクを無効にすることです。現在、すべての本番アプリでこれを行っています。

開発モードで提供されるコンパイル済みアセットを回避するには (必要な動的パイプライン コンパイルをオーバーライドします)、次の手順を実行します。

development.rb に次の行を追加します。

config.assets.prefix = "/dev-assets"

これは、application.rb (通常は "/assets") で設定されているものを上書きします。

これも application.rb で必要になります。

config.assets.initialize_on_precompile = false

これにより、データベースに接続しようとするタスクが停止します。(アセットで ActiveRecord モデルを参照している場合は注意してください。これは機能しません)。

これらの変更により、アセットをローカルでコンパイルしてリポジトリにコミットし、作業中の開発ツリーにそれらのファイルを含めることができますが、開発リクエストは引き続き Sprockets に送信されます。さらに、何かが実際に変更された場合にのみ、プリコンパイルしてコミットする必要があります。

私のブログ投稿を参照してください

于 2012-03-17T00:34:23.103 に答える