2009-07-17 2 views
1

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

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

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


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

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

ответ

2

Если файлов нет, 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 будут видеть существующие кэши, а не зацикливать вашу память.

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

Удачи вам!