Rake assets: precompile занимает очень много времени, чтобы завершить

В моей песочнице dev

RAILS_ENV=production rake assets:precompile

занимает более 4 минут. Это нормально. На героку уходит более 10 минут, чтобы выполнить эту работу, а иногда и время. Есть ли способ обмануть это и/или ускорить его?

UPDATE

Я профилировал фазы компиляции CSS vs JS

3.7 s        js
175 s            css

Цифры были сделаны, используя здесь

----------------------
/Users/bradphelan/.rvm/gems/[email protected]/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/[email protected]/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

Ответ 1

Решение для взлома hackety кажется, что обезьяна исправляет стандартный механизм сжатия sass. Я добавил это в начало моего приложения .rb

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

Разница в размере файла составляла 124 тыс. до патча обезьяны и 125 тыс. после и порядка увеличения скорости.

Ответ 2

Я на Rails 3.2.13. У меня была такая же проблема с сжатием css, что занимает очень много времени. Исправить:

В Gemfile добавьте:

gem 'yui-compressor'

В config/environment/production.rb:

config.assets.css_compressor = :yui
config.assets.js_compressor = :yui

rake assets: прекомпиляция без этих изменений: 325 секунд

активы рейка: прекомпиляция с этими изменениями: 79 секунд

активы рейка: прекомпиляция без сжатия: 45 секунд

Ответ 3

Самый лучший вариант - компилировать локально, фиксировать и развертывать как обычно, отключая задачу прекомпиляции для производства. Сейчас я делаю это для всех своих производственных приложений.

Чтобы обойти эти скомпилированные активы, обслуживаемые в режиме разработки (переопределение динамической компиляции конвейера, которая вам нужна), выполните следующие действия.

В development.rb разместите следующую строку:

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

Это превысит все, что установлено в application.rb(обычно "/assets" ).

Вам также понадобится это в application.rb:

config.assets.initialize_on_precompile = false

Это останавливает задачу, пытающуюся подключиться к вашей базе данных. (Остерегайтесь, если вы ссылаетесь на модели ActiveRecord в своих активах, так как это не сработает).

Эти изменения позволяют скомпилировать и перенести активы в репозиторий локально и иметь эти файлы в рабочем дереве разработки, но для запросов на разработку все еще нужно отправить Sprockets. Кроме того, вы должны предварительно прекомпилировать и зафиксировать, когда что-то действительно изменилось.

Ref мой пост в блоге