Rake assets: прекомпиляция медленная
Команда "rake assets: precompile" работает очень медленно для меня. Особенно на моем сервере производства Amazon EC2 Micro, который не имеет большого количества ресурсов процессора. В EC2 я должен ждать 1 минуту или более во время каждого развертывания только для этой задачи предварительной компиляции. Есть ли способ сделать это быстрее?
Раньше я использовал Jammit для сжатия/минимизации css и js. Джаммит работал почти в 10 раз быстрее на том же веб-сайте и серверах.
Ответы
Ответ 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