Rails 3.1静态资产 - 必须为生产环境预编译资产吗?

7
我对Rails 3.1中的新资产管道在生产模式下的理解如下:
  1. config.action_controller.asset_host = "https://mybucket.s3.amazonaws.com"
  2. config.assets.compile = false
  3. app/assets被检入代码库
  4. 使用bundle exec rake assets:precompile并将其与S3同步(所有资产)
  5. public/assets未被检入代码库
有了以上所有内容,我认为Rails会在S3上查找所有资产,因此我不需要在代码库中保存它们。或者至少我不需要在代码库中保存预编译的位于public/assets的资产。
我发现,在Heroku上,如果没有config.assets.compile = true,它根本找不到S3上的预编译资产。而且Heroku必须运行所有资产的编译阶段,然后将它们从S3提供出来。运行heroku run rake assets:precompile没用。生产过程会重新编译所有内容。
这对我来说毫无意义。
让CDN处理图片,你不需要在代码库中存储它们,这对我来说是有意义的。
我觉得这是不正确的。我是对还是错?

我可以添加...似乎Rails在生产服务器上必须“看到”public/assets,以便它“知道”资源已经被编译。因此,你的资源必须在代码仓库中复制一份,分别放在app/assetspublic/assets中。这样对吗? - Karl
你有没有碰巧查看过资产管道指南 - Justin Hammack
是的。它没有提供足够深层次的细节来回答我的问题。 - Karl
6个回答

2
一定要去github上查看asset_sync。或者阅读我们在Heroku开发中心的文章:在Heroku上使用CDN资产主机与Rails 3.1
最近,Heroku实验室插件解决了环境变量的问题,使您的应用程序的heroku config变量在编译时可访问。要启用此功能,请阅读有关user_env_compile插件的信息。这意味着您不再需要在部署应用程序后运行heroku run rake assets:precompile
还有,使用asset_sync相对于让您的应用程序在生产中懒惰地编译资产或直接从应用程序服务器上提供预编译的资产,可以获得相当大的性能提升。但是我会说,我写过它。
  • 使用asset_sync和S3,您可以预编译资产,这意味着所有资产都已准备好立即在资产主机/ CDN上提供。
  • 您只能在预编译时在application.rb中要求:assets捆绑包,从而节省生产内存。
  • 您的应用程序服务器永远不会受到资产请求的影响。您可以花费昂贵的计算时间,您知道。计算。
  • 默认设置了最佳实践HTTP缓存标头
  • 您可以通过一个额外的配置启用自动gzip压缩

请问启用gzip压缩的额外配置是什么?谢谢。 - Nicolas

2
当您设置如下内容时:

config.assets.compile = false

将不会有任何资源请求被传递给Sprockets进行服务。预期这些文件已经在其他地方进行了预编译。
请查看Heroku网站上的资产管道设置指南,因为需要特殊设置才能使其正常工作。

Heroku 似乎经常添加/更改资产管道指南。 我想其中一部分原因是由于我的支持票。 - Karl
看我的回答,我做了完全相反的事情,并且有 config.assets.compile = true - ATSiem

1

我调整了我的production.rb文件,包括以下三项设置:1)config.assets.precompile += %w( *.js *.css ) 2)config.serve_static_assets = true 和3)config.assets.compile = true,这对我起了作用。

在添加这些设置之前,我的开发环境中加载了所有的JS/CSS资源,但是在Heroku上的生产环境却缺失了它们。

另请参见: Rails javascript asset missing after precompile


1
出于我永远无法理解的原因,我无法将上面的答案标记为有用 - 但我的资产位于Amazon S3上,而我的应用程序部署到了Heroku上,我也遇到了同样的问题。
只需检查“public/assets/manifest.yml”即可解决在Heroku上出现的“资源未预编译”的错误。

0
我认为发生的情况是它正在查找manifest.yml以了解是否已编译资产。由于此文件默认位于public/assets中,而您没有将其检入存储库中,因此它会假定资产尚未编译。尝试更改config/environments/production.rb文件中的位置,看看是否可以解决问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接