Рейк активы: прекомпиляция занимает очень много времени, чтобы завершить - PullRequest
14 голосов
/ 16 марта 2012

В моей песочнице для разработчиков

RAILS_ENV=production rake assets:precompile

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

UPDATE

Я профилировал фазы компиляции 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 ]

5 голосов
/ 31 мая 2013

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

В Gemfile добавьте:

gem 'yui-compressor'

В конфиге / средах / production.rb:

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

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

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

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

3 голосов
/ 17 марта 2012

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

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

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

1 голос
/ 19 октября 2013

Мы получили ускорение на несколько порядков, используя этот ответ:

EXECJS_RUNTIME='Node' JRUBY_OPTS="-J-d32 -X-C" RAILS_ENV=development bundle exec rake war

http://avinmathew.com/improving-rails-asset-precompile-times-on-jruby/

1 голос
/ 17 марта 2012

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

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

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

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

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

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

config.assets.initialize_on_precompile = false

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

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

Ссылка мой пост в блоге

...