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
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
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
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"
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
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