2013-06-02 2 views
0

사용 사례 : Heroku에 내 Rails 4.rc1 앱을 푸시하고 자산 사전 컴파일을 수행 한 다음 asset_sync gem을 사용하여 S3에 저장하십시오. 구성에서 S3에 대해 asset_host를 설정했습니다.Heroku Slug 컴파일에서 Rake 작업의 자산 파이프 라인 URL을 가져옵니다.

슬러그 컴파일 중 다른 지형도 작성 점의 앱에서 볼 수 있도록 지문이 새겨진 애셋 URL을 Redis에 덤프하고 동일한 애셋 파일을 사용하고 싶습니다. 본질적으로 :

//s3.amazonaws.com/my_bucket/assets/desktop-(fingerprint).css 

분명히, 배포 사이의 지문이 변경되고 다른 앱에는 업데이트 된 URL이 필요합니다. 이 밖으로 버려진

module AssetShare 
    class << self 
    def capture_urls 
     action_controller = ActionController::Base.new 
     REDIS.set('desktop_css_url',action_controller.view_context.stylesheet_url('desktop')) 
     REDIS.set('mobile_css_url',action_controller.view_context.stylesheet_url('mobile')) 
    end 
    end 
end 

desc 'Capture asset pipeline stylesheet and javascript URLS to Redis' 
task 'assets:capture_urls' => :environment do 
    AssetShare.capture_urls 
end 

# stolen from asset_sync 
if Rake::Task.task_defined?("assets:precompile:nondigest") 
    Rake::Task["assets:precompile:nondigest"].enhance do 
    AssetShare.capture_urls 
    end 
else 
    Rake::Task["assets:precompile"].enhance do 
    AssetShare.capture_urls 
    end 
end 

:

여기 내 첫 번째 시도이다

//s3.amazonaws.com/my_bucket/stylesheets/desktop.css 

가 그럼 난이 자원을 찾았지만, 톱니 레일 4에서 변경되었습니다 http://blog.noizeramp.com/2011/10/14/asset-urls-and-paths-in-rake-tasks/가 여기 내 두 번째 시도이다

:

desc 'Capture asset pipeline stylesheet and javascript URLS to Redis' 
task 'assets:capture_urls' => :environment do 
    MyApp::Application.configure do 
    config.assets.debug = false 
    config.assets.digest = true 
    end 

    include ActionView::Helpers::AssetTagHelper 

    desktop_url = stylesheet_url('desktop', only_path: false) 
    REDIS.set('desktop_css_url', desktop_url) 
    puts "Saved desktop url to Redis for Store Rails app: #{desktop_url}" 

    mobile_url = stylesheet_url('mobile', only_path: false) 
    REDIS.set('mobile_css_url', mobile_url) 
    puts "Saved mobile url to Redis for Store Rails app: #{mobile_url}" 
end 

# stolen from asset_sync 
if Rake::Task.task_defined?("assets:precompile:nondigest") 
    Rake::Task["assets:precompile:nondigest"].enhance do 
    Rake::Task["assets:capture_urls"].invoke 
    end 
else 
    Rake::Task["assets:precompile"].enhance do 
    Rake::Task["assets:capture_urls"].invoke 
    end 
end 
(210)

이 단지 밖으로 덤프 : 분명히

/stylesheets/desktop.css 

첫 번째 시도 그것을 가까이. 나는 지문이 찍힌 URL을 덤프 할 수 없다. heroku 툴킷을 통해 레이크 작업을 실행하면 올바른 지문 URL이 인쇄됩니다. 생각?

desc 'Capture asset pipeline stylesheet and javascript URLS to Redis' 
    task 'assets:urls:capture' => :environment do 

     # unfortunately, this way doesn't work when deploying 
     #controller = MyApp::Application::ApplicationController.new 
     #desktop_url = controller.view_context.stylesheet_url('desktop') 
     #mobile_url = controller.view_context.stylesheet_url('mobile') 

     desktop_url = MyApp::Application.config.action_controller.asset_host 
     desktop_url += "/" + AssetSync.storage.get_remote_files.select{|d| d.include?('desktop') && d.include?('.css') }.first 
     REDIS.set('desktop_css_url', desktop_url) 
     puts "Saved desktop url to Redis for Store Rails app: #{desktop_url}" 

     mobile_url = MyApp::Application.config.action_controller.asset_host 
     mobile_url += "/" + AssetSync.storage.get_remote_files.select{|d| d.include?('mobile') && d.include?('.css') }.first 
     REDIS.set('mobile_css_url', mobile_url) 
     puts "Saved mobile url to Redis for Store Rails app: #{mobile_url}" 
    end 

    desc 'Clear asset pipeline stylesheet and javascript URLS from Redis' 
    task 'assets:urls:clear' => :environment do 
     REDIS.del('desktop_css_url') 
     puts "Cleared desktop url from Redis" 
     REDIS.del('mobile_css_url') 
     puts "Cleared mobile url from Redis" 
    end 

    # stolen from asset_sync 
    if Rake::Task.task_defined?("assets:precompile:nondigest") 
     Rake::Task["assets:precompile:nondigest"].enhance do 
     Rake::Task["assets:urls:capture"].invoke 
     #Rake::Task["assets:urls:clear"].invoke 
     end 
    else 
     Rake::Task["assets:precompile"].enhance do 
     Rake::Task["assets:urls:capture"].invoke 
     #Rake::Task["assets:urls:clear"].invoke 
     end 
    end 

내가 올바른 지문 URL을 결코 할 수는 Heroku가에 배포 중에 덤프되는 :

답변

0

궁극적으로, 이것은 내가 함께 가야했다 솔루션입니다. 그것은 생산 환경으로 운영되고 있다고 말한다. 그러면 Redis의 URL이 다음과 같이 나타납니다.

//s3.amazonaws.com/my_bucket/assets/desktop-6acd36e3d6c8d2b6e0fe58b83690687f.css