Подтвердить что ты не робот

Rake assets: прекомпиляция медленная

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

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

4b9b3361

Ответ 1

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

config.assets.initialize_on_precompile = false

EDIT: Я только что написал камень для решения этой проблемы, называемый turbo-sprockets-rails3. Это ускоряет ваш assets:precompile, только перекомпилируя измененные файлы и только компилируя один раз для создания всех активов.

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

Ответ 2

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

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

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

Ответ 3

Мое решение состоит в том, чтобы исключить 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