рейк активов: прекомпиляция идет медленно - PullRequest
25 голосов
/ 24 сентября 2011

Команда "rake assets: precompile" работает очень медленно для меня.Особенно на моем производственном сервере Amazon EC2 Micro, который не имеет много процессорных ресурсов.На EC2 мне приходится ждать 1 минуту или больше во время каждого развертывания только для одной задачи прекомпиляции.Есть ли способ сделать это быстрее?

Ранее я использовал Jammit для сжатия / минимизации css и js.Jammit работал почти в 10 раз быстрее на одном веб-сайте и серверах.

Ответы [ 3 ]

30 голосов
/ 16 января 2012

Если вам не нужно загружать среду Rails, вы должны отключить это с помощью:

config.assets.initialize_on_precompile = false

РЕДАКТИРОВАТЬ: я только что написал гем для решения этой проблемы, под названием turbo-звездочки-rails3 .Он ускоряет вашу assets:precompile, перекомпилируя только измененные файлы и компилируя только один раз для генерации всех ресурсов.

Было бы здорово, если бы вы могли помочь мне протестировать turbo-sprockets-rails3 драгоценный камень, и дайте мне знать, если у вас есть какие-либо проблемы.

10 голосов
/ 25 сентября 2011

В Rails 3.1.0 есть ошибка , которая включает слишком много файлов в процессе прекомпиляции. Это может быть причиной медлительности, если у вас много активов js и css.

Другая причина в том, что Sprockets (самоцвет, выполняющий компиляцию) более сложен и должен допускать дополнительные параметры - scss, coffeescript и erb. Из-за этого я подозреваю, что будет медленнее делать только конкатенацию и минификацию.

Как и предполагалось, вы можете предварительно скомпилировать файлы перед их развертыванием, если это все еще проблема.

1 голос
/ 24 июня 2012

Мое решение состоит в том, чтобы исключить application.js .css и любые другие связанные с приложением активы из предварительной компиляции. Так что я могу использовать rake assets:precompile один раз для прекомпиляции только связанных с движком ресурсов.

Затем при каждом развертывании я использую простое задание на грабли, чтобы создать ресурсы, связанные с любым приложением, и объединить их в manifest.yml:

namespace :assets do
  task :precompile_application_only => :environment do
    require 'sprockets'

    # workaround used also by native assets:precompile:all to load sprockets hooks 
    _ = ActionView::Base

    # ==============================================
    # = Read configuration from Rails / assets.yml =
    # ==============================================

    env           = Rails.application.assets
    target        = File.join(::Rails.public_path, Rails.application.config.assets.prefix)
    assets        = YAML.load_file(Rails.root.join('config', 'assets.yml'))
    manifest_path = Rails.root.join(target, 'manifest.yml')
    digest        = !!Rails.application.config.assets.digest
    manifest      = digest


    # =======================
    # = Old manifest backup =
    # =======================

    manifest_old = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {}

    # ==================
    # = Compile assets =
    # ==================

    compiler = Sprockets::StaticCompiler.new(env,
                                            target,
                                            assets,
                                            :digest => digest,
                                            :manifest => manifest)
    compiler.compile

    # ===================================
    # = Merge new manifest into old one =
    # ===================================

    manifest_new  = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {}

    File.open(manifest_path, 'w') do |out|
       YAML.dump(manifest_old.merge(manifest_new), out)
    end

  end
end

Чтобы указать, какие ресурсы для компиляции, я использую файл конфигурации YAML (config/assets.yml):

например.

---
- site/site.css
- admin/admin.css
- site/site.js
- admin/admin.js
...