2009-06-11 3 views
1

私はs3でアセットをホストしています。本番環境では、/javascripts/cache/all.jsと/stylesheets/cache/all.cssを探しています。私はキャップを使って展開するときに、プラグインを使用してs3にパブリックディレクトリをスワップしています。問題は、レールが最初に要求されるまでこれらのキャッシュファイルを作成しないため、パブリックディレクトリを転送する際に配備中にキャッシュファイルが周囲にないことです。展開中にこれらのファイルを強制的に作成する簡単な方法はありますか?レールにアセットキャッシュファイルを作成させる

答えて

4

キャッシュファイルを作成する実際のレールモジュールは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の定数はインクルードされたモジュールで定義されており、compute_xxx_paths呼び出しのtrueパラメータは、すべてのファイルを再帰的にインクルードする必要があることを示しています。

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

私はrakeタスクファイルでこれを使用します。

は、私はちょうどファイルを書いたシンプルなキャップタスクを作成しました。追加のクラスを作成するからあなたを保存し、あなたがエンジンヤードクラウドを使用している場合 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

からの値を使用しているので、あなたはDRYそれを維持する、これは私がやったことです:

を追加

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/tasks/assetcache.rakeファイルは、私が 'ACTION_VIEW' クラスを必要と

/lib/assetwriter.rb追加しました( write_asset_file_contents:

AssetCacheWriter

はActionView ::ヘルパー:: AssetTagHelper

はデフ write_asset_file_contents(真)[すべて] File.join(JAVASCRIPTS_DIR、 "キャッシュ/ all.js")、compute_javascript_pathsを()書きが含まFile.join(STYLESHEETS_DIR、 "キャッシュ/ all.css")、compute_stylesheet_paths([すべて]、真)) 終了

エンド

その後、私は

を/deploy/after_restart.rbに追加

ラン「のCD#{release_path} & &束EXECすくいassetcache:生成」

0

を私は順序が(したがって、例えば、jQueryの他のスクリプトの前に含まれている)大事ので、代わりに以下の手法を用い含むことを見出しました。 :defaultsの使用も許可します。そして

#!/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 

キャップタスク:

まず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 

そしてスクリプト/ package_assets上記のアプローチのレール3.0.7なしで

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

動作するように見えた。私は設定が未定義であることについて多くのエラーを得ました。

Railsのコードを見て手を汚した後、私はこの解決策を思いつきました。

のlib /タスク/ 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

関連する問題