用例:将我的 Rails 4.rc1 应用程序推送到 Heroku,进行资产预编译,然后使用 assets_sync gem 将它们放在 S3 上。我在配置中为 S3 设置了asset_host。
在此之后但在 slug 编译期间,我想将指纹资产 URL 转储到 Redis,以便其他 Heroku 应用程序可以看到它(它们共享相同的 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
然后我找到了这个资源,但是 Rails 4 中的 Sprockets 发生了变化: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
这只是倾倒了:
/stylesheets/desktop.css
显然第一次尝试它更接近。我只是无法让它转储指纹网址。如果我通过 heroku 工具包运行 rake 任务,则会打印出正确的指纹 URL。想法?