Кэширование активов Rails - PullRequest
1 голос
/ 17 июля 2009

При использовании Capistrano для развертывания при каждом развертывании я обнаружил, что Rails регенерирует весь кеш ресурсов JS & CSS. Это независимо от того, обновлен файл или нет.

Есть ли способ заставить Rails сделать это, только если один или несколько файлов были обновлены?

Я выключил : normalize_asset_timestamps в Capistrano, так что проблем не должно быть.


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

Заранее спасибо.

1 Ответ

2 голосов
/ 22 июля 2009

Если файлов нет, Rails их создаст. Вы могли бы скопировать старые кэшированные ресурсы в новый каталог перед запуском вашего кода Rails, однако я не верю, что capistrano умеет понимать, какие файлы были изменены, поэтому вы не будете знать, когда это сделать.

Если вы хотите именно то, что вы описываете, я бы, возможно, md5sum старые и новые каталоги js / css и поискал разницу. Если он есть, вам нужно собрать его с нуля, если его нет, вы можете просмотреть старые файлы.

В качестве альтернативы, если все, что вас волнует, это память, которую вы можете создать для ресурсов перед запуском серверов. Что-то вроде:

class AssetCache
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::AssetTagHelper

  APPLICATION_JAVASCRIPTS = %w{ mootools mycustom admin }

  def pre_cache
    javascript_include_tag JAVASCRIPT_ASSETS,
                           :cache => 'cache/app.js'
  end
end

И в шапке перед запуском демонов Rails запустите script/runner -e production AssetCache.new.pre_cache, чтобы заполнить файлы. В ваших макетах просто используйте AssetCache::APPLICATION_JAVASCRIPTS вместо встроенного списка файлов. Ополосните, повторите и вымойте для стилей. Демоны Rails увидят существующие кэши, а не забьют вашу память.

Если вы работаете на нескольких серверах, вам, вероятно, потребуется реплицировать ресурсы без изменения их временных меток.

Удачи!

...