2009-06-11 6 views
1

J'héberge mes actifs sur s3. En production, les rails recherchent /javascripts/cache/all.js et /stylesheets/cache/all.css. J'utilise un plugin pour basculer le répertoire public sur s3 lorsque je le déploie avec cap. Le problème est que les rails ne créent pas ces fichiers de cache tant qu'ils ne sont pas demandés pour la première fois, donc ils ne sont pas présents lors du déploiement lorsque je transfère le répertoire public. Existe-t-il un moyen facile de forcer la création de ces fichiers lors du déploiement?Forcer des rails pour créer des fichiers cache d'actifs

Répondre

4

Le module Rails réel qui crée les fichiers de cache est le ActionView::Helpers::AssetTagHelper que vous pouvez réutiliser pour créer les fichiers de cache pendant le déploiement. Ce qui suit a bien fonctionné pour moi:

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 

ces deux write_asset_file_contents appels que j'ai soulevé du code rails. Les constantes _DIR sont définies dans le module inclus et les paramètres true dans les appels compute_xxx_paths indiquent que tous les fichiers doivent être inclus de manière récursive.

J'ai créé une tâche simple bouchon qui vient d'écrire les fichiers sur:

namespace :sample 
    task :assets do 
    AssetCacheWriter.new.write 
    end 
end 
3

J'utilise ceci dans un fichier de tâche de râteau. vous évite de créer une classe supplémentaire et vous garder au sec parce que vous utilisez les valeurs de la 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

Si vous utilisez Engine Yard Nuage, voici ce que je faisais:

a ajouté un fichier /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 

j'ajouté /lib/assetwriter.rb

exigent la classe 'ACTION_VIEW' AssetCacheWriter

comprennent ActionView :: :: Helpers AssetTagHelper

écrire def write_asset_file_contents (File.join (JAVASCRIPTS_DIR, "cache/all.js"), compute_javascript_paths ([: tous], true)) write_asset_file_contents (File.join (STYLESHEETS_DIR, "cache/all.css"), compute_stylesheet_paths ([: tous], true)) fin

fin

j'ajouté à /deploy/after_restart.rb

run "cd # {release_path} & bundle & de assetcache râteau exec: générer"

0

Je trouve que comprennent l'ordre compté (ainsi, par exemple, jQuery est inclus avant d'autres scripts) et ainsi utilisé à la place de l'approche ci-dessous. Permet également l'utilisation de: par défaut.

Première 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 

Puis 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 

Ensuite, une tâche de cap:

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 
0

Dans Rails 3.0.7 aucune des approches ci-dessus semblait fonctionner. J'ai eu beaucoup d'erreurs à propos de config étant indéfini. Après avoir mis mes mains dans la poussière en regardant le code Rails, j'ai trouvé cette solution qui fonctionne pour moi.

lib/tâches/cache_assets.rake

require 'asset_packager' 

desc "cache assets" 
task :cache_assets do 

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

end 

Et puis 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 

Ensuite, pour l'exécuter, il suffit d'exécuter rake cache_assets