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 мой пост в блоге
Ответ 4
У нас был порядок ускорения, используя этот ответ:
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/