Rails 3.1静态资产 - 必须通过预编译为生产资产?

时间:2011-09-06 18:15:22

标签: ruby-on-rails-3.1 asset-pipeline

我对生产模式下新Rails 3.1资产管道的理解如下: - >

  1. config.action_controller.asset_host = "https://mybucket.s3.amazonaws.com"
  2. config.assets.compile = false
  3. app/assets已检入回购
  4. 捆绑exec rake资产:预编译并与S3同步(所有资产)
  5. public/assets未检入回购
  6. 综上所述,我认为Rails会查找S3上的所有资产,而我不需要它们在存储库中。或者至少我不需要回购邮件public/assets中的预编译资产。

    我在heroku上发现了这个,如果没有config.assets.compile = true,它就会在S3上找不到预编译的资产。并且heroku 必须运行所有资产的编译阶段,但随后将服务于S3。运行heroku run rake assets:precompile不会蹲下。生产过程将重新编译所有内容。

    咦?这对我来说毫无意义。

    我觉得你不需要用图像填充你的回购,让你的CDN做你的工作。

    我觉得这是不正确的。我是对还是错?

6 个答案:

答案 0 :(得分:2)

当你有这个集合时:

config.assets.compile = false

不会将资产请求传递给要提供的Sprockets。预计文件将在某处预编译。

查看Heroku网站上的asset pipeline setup guide,因为有一个特殊设置可以让它正常工作。

答案 1 :(得分:2)

绝对可以在github上查看 asset_sync 。或者我们的Heroku开发中心文章Using a CDN asset Host with Rails 3.1 on Heroku

环境变量的问题最近已由Heroku labs插件解决,该插件使您的应用程序的heroku config变量在编译期间可访问。要启用此功能,请阅读user_env_compile插件。这意味着您在部署应用程序后不再需要运行heroku run rake assets:precompile

另外。使用 asset_sync 与让您的应用程序懒惰地在生产中编译资产或直接在应用服务器上预编译它们相比,性能有了很大提升。不过我会说。我写了。

  • 使用asset_sync和S3,您可以预编译资产,这意味着所有资产都可以立即在资产主机/ CDN上提供服务
  • 您只能在预编译中的application.rb中需要:assets 包,从而节省生产中的内存
  • 您的应用服务器永远不会受到资产请求的影响。你知道,你可以花费昂贵的计算时间。计算
  • 最佳实践HTTP缓存标头默认设置为
  • 您可以使用一个额外的配置启用自动gzip压缩

答案 2 :(得分:1)

由于我永远不会理解的原因,我无法将上述答案标记为有用 - 但我的资产在Amazon S3和我的应用程序部署到Heroku时遇到了同样的问题。

只需检入“public / assets / manifest.yml”即可解决Heroku上“资产未预编译”的错误。

答案 3 :(得分:1)

调整我的production.rb文件以包含1)config.assets.precompile += %w( *.js *.css ) 2)config.serve_static_assets = true和3)config.assets.compile = true为我做了诀窍。

在包含这些之前......我的开发环境已经加载了所有JS / CSS资源,但Heroku上的Production却遗漏了它们。

另见:Rails javascript asset missing after precompile

答案 4 :(得分:0)

让我给你一个很大的提示,以官方的Heroku方式做到:

http://devcenter.heroku.com/articles/cdn-asset-host-rails31

https://github.com/rumblelabs/asset_sync

它将为您完成所有工作,Heroku将预编译,然后asset_sync gem将其复制到您的s3目录,url_helpers将正常工作。我认为缺点是您必须运行预编译阶段(但它只在更改内容时复制)并且您必须将资产存储在git仓库中。

答案 5 :(得分:0)

我认为正在发生的事情是它正在寻找manifest.yml来了解资产是否已被编译。由于此文件默认位于公共/资产中,并且您没有将其检入您的仓库,因此假设资产尚未编译。尝试更改config/environments/production.rb中文件的位置,看看是否能解决问题