【问题标题】:Rails 3.1 Static Asset - Must Assets by Precompiled for Productions?Rails 3.1 静态资产 - 必须为制作预编译资产吗?
【发布时间】:2011-11-11 13:32:54
【问题描述】:

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

  1. config.action_controller.asset_host = "https://mybucket.s3.amazonaws.com"
  2. config.assets.compile = false
  3. app/assets 已签入 repo
  4. 捆绑 exec rake 资产:预编译并与 S3 同步(所有资产)
  5. public/assets 未检入回购

通过以上所有内容,我认为 Rails 会在 S3 上查找所有资产,而我不需要在存储库中使用它们。或者至少我不需要 repo 中 public/assets 中的 预编译 资产。

我在 heroku 上找到了这个,如果没有 config.assets.compile = true,它完全不会在 S3 上找到预编译的资产。 Heroku 必须为所有资产运行编译阶段,然后将它们从 S3 中服务出来。运行heroku run rake assets:precompile 不会进行深蹲。生产过程会重新编译一切。

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

我觉得你不需要用图像填充你的存储库,让你的 CDN 来完成工作。

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

【问题讨论】:

  • 我可以添加...看起来 Rails 必须“看到”生产服务器上的 public/assets 才能“知道”资产已被编译。因此,您的资产必须在您的回购中复制,一次在app/assetspublic/assets 中。这是正确的吗?
  • 你检查过Asset Pipeline Guide!偶然?
  • 是的。它只是没有提供足够的深层细节来回答我的问题。

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


【解决方案1】:

当你有这一套时:

config.assets.compile = false

不会将任何资产请求传递给要服务的 Sprocket。预计文件将在某处预编译。

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

【讨论】:

  • Heroku 似乎经常添加/更改资产管道指南。我想他们的部分兴趣是我的支持票。
  • 在下面查看我的答案,我做了完全相反的事情,并且有config.assets.compile = true
【解决方案2】:

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

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

还有。使用 asset_sync 与让您的应用程序在生产环境中懒惰地编译资产或直接从您的应用程序服务器预编译的资产提供相当大的性能改进。不过我会这么说。我写的。

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

【讨论】:

  • 启用 gzip 压缩的额外配置是什么?谢谢
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    调整我的 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

    【讨论】:

      【解决方案5】:

      让我给你一个很大的提示,按照 Heroku 官方的方式来做:

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

      https://github.com/rumblelabs/asset_sync

      这一切都会为您完成,Heroku 将进行预编译,然后asset_sync gem 会将其复制到您的 s3 目录中,而 url_helpers 将正常工作。我想缺点是你必须运行预编译阶段(但它只在内容发生变化时复制)并且你必须将你的资产存储在你的 git repo 中。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2011-12-20
          • 1970-01-01
          • 2012-05-20
          • 1970-01-01
          • 2011-11-30
          • 2011-12-31
          • 2011-12-31
          • 2013-09-27
          • 1970-01-01
          相关资源
          最近更新 更多