Принуждение рельсов для создания файлов кэша активов - PullRequest
1 голос
/ 12 июня 2009

Я размещаю свои активы на s3. В производстве rails ищет /javascripts/cache/all.js и /stylesheets/cache/all.css. Я использую плагин для переключения публичного каталога на s3 при развертывании с помощью cap. Проблема в том, что rails не создает эти файлы кэша до тех пор, пока они не будут запрошены в первый раз, поэтому их нет во время развертывания, когда я передаю общедоступный каталог. Существует ли простой способ форсировать создание этих файлов во время развертывания?

Ответы [ 5 ]

4 голосов
/ 12 июня 2009

Фактическим модулем rails, который создает файлы кэша, является ActionView::Helpers::AssetTagHelper, который вы можете использовать повторно для создания файлов кэша во время развертывания. Следующее работало хорошо для меня:

require 'action_view'
class AssetCacheWriter

  include ActionView::Helpers::AssetTagHelper

  def write
    write_asset_file_contents(File.join(JAVASCRIPTS_DIR, "all.js"), compute_javascript_paths([:all], true))
    write_asset_file_contents(File.join(STYLESHEETS_DIR, "all.css"), compute_stylesheet_paths([:all], true))
'standard_all')
  end

end

Обе эти write_asset_file_contents звонки, которые я снял с кода рельсов. Константы _DIR определены во включенном модуле, а параметры true в вызовах compute_xxx_paths указывают, что все файлы должны быть включены рекурсивно.

Я создал простую задачу cap, которая просто записала файлы:

namespace :sample
  task :assets do
    AssetCacheWriter.new.write
  end
end
3 голосов
/ 06 апреля 2010

Я использую это в файле задач граблей. Спасает вас от создания дополнительного класса, и вы сохраняете его СУХИМ, потому что вы используете значения из stylesheet_link_tag / javascript_include_tag

desc "Clears javascripts/cache and stylesheets/cache"   task :clear => :environment do
  puts "Clearing javascripts/cache and stylesheets/cache"
  FileUtils.rm(Dir['public/javascripts/cache_[^.]*']) # use :cache => 'cache_all.js' in stylesheet_link_tag
  FileUtils.rm(Dir['public/stylesheets/cache_[^.]*']) # use :cache => 'cache_all.css' in javascript_include_tag
end

desc "Recreate the javascripts/stylesheets cache."
  task :generate => [:environment, :clear] do
  puts "Recreate the javascripts/stylesheets cache"
  ActionController::Base.perform_caching = true
  app = ActionController::Integration::Session.new
  app.get '/'
end
1 голос
/ 11 мая 2010

Если вы используете Engine Yard Cloud, это то, что я сделал:

добавил файл /lib/tasks/assetcache.rake

    require 'assetwriter'

    namespace :assetcache do

      desc "Clears javascripts/cache and stylesheets/cache"   
      task :clear => :environment do
        puts "Clearing javascripts/cache and stylesheets/cache"
        FileUtils.rm(Dir['public/javascripts/cache_[^.]*'])
# use :cache => 'cache_all.js' in stylesheet_link_tag
        FileUtils.rm(Dir['public/stylesheets/cache_[^.]*'])
# use :cache => 'cache_all.css' in javascript_include_tag
      end

      desc "Recreate the javascripts/stylesheets cache."
      task :generate => [:environment, :clear] do
        puts "Recreate the javascripts/stylesheets cache"
        AssetCacheWriter.new.write
      end

    end

тогда я добавил /lib/assetwriter.rb

требуется 'action_view' класс AssetCacheWriter

включает ActionView :: Helpers :: AssetTagHelper

def write write_asset_file_contents (File.join (JAVASCRIPTS_DIR, "cache / all.js"), compute_javascript_paths ([: all], true)) write_asset_file_contents (File.join (STYLESHEETS_DIR, "cache / all.css"), compute_stylesheet_paths ([: all], true)) конец

конец

затем я добавил в /deploy/after_restart.rb

запустите "cd # {release_path} && bundle exec rake assetcache: generate"

0 голосов
/ 05 октября 2011

В Rails 3.0.7 ни один из вышеперечисленных подходов не работал. Я получил много ошибок о том, что конфигурация не определена.

После того, как мои руки испачкались, просматривая код Rails, я пришел к этому решению, которое работает для меня.

Библиотека / задачи / cache_assets.rake

require 'asset_packager'

desc "cache assets"
task :cache_assets do

  puts "-----> Caching Assets"
  AssetCacheWriter.new.write
  puts "-----> Done!"

end

А потом lib / asset_packager.rb

require 'action_view'

class AssetCacheWriter
  include ActionView::Helpers::AssetTagHelper
  include ActionView::Helpers::TagHelper 

  def config
    ApplicationController
  end

  def controller    
    ApplicationController
  end


  def write
    ActionController::Base.perform_caching = true    

    # You can replace these with your app's cached assets. They should look the same
    # as in your view templates.
    stylesheet_link_tag :vendor, :defaults, :cache => 'cached/all'
    javascript_include_tag :bd_defaults, :'vendor-head', :cache => 'cached/defaults_vendor'

  end

end

Затем, чтобы выполнить его, просто запустите rake cache_assets

0 голосов
/ 18 ноября 2010

Я обнаружил, что включить порядок имеет значение (например, jQuery включен перед другими сценариями), и поэтому использовал вместо этого приведенный ниже подход. Также позволяет использовать: по умолчанию.

Первая библиотека lib / asset_pacakger:

require 'action_view'

class AssetCacheWriter
  include ActionView::Helpers::AssetTagHelper
  include ActionView::Helpers::TagHelper 

  def write
    ActionController::Base.perform_caching = true    
    stylesheet_link_tag *ApplicationController::STYLESHEET_INCLUDES
    javascript_include_tag *ApplicationController::JAVASCRIPT_INCLUDES
  end
end

Затем scripts / package_assets:

#!/usr/bin/env ruby

RAILS_ROOT = File.expand_path(File.dirname(__FILE__) + '/../')
Dir.chdir(RAILS_ROOT)

RAILS_ENV = ENV['RAILS_ENV'] || 'development'

puts "Bundling assets for environment #{RAILS_ENV}"

require File.join('config', 'environment') 

AssetCacheWriter.new.write

Затем задание на ограничение:

desc "Package assets"
task :package_assets do
  %x[#{Dir.getwd}/script/package_assets] 
  %x[svn commit #{Dir.getwd}/public/javascripts/defaults.js #{Dir.getwd}/public/stylesheets/defaults.css -m "(capistrano) packaging assets to trunk"]
  logger.info "packaged assets to trunk"
end
...