我对生产模式下新Rails 3.1资产管道的理解如下: - >
"https://mybucket.s3.amazonaws.com"
app/assets
已检入回购public/assets
未检入回购综上所述,我认为Rails会查找S3上的所有资产,而我不需要它们在存储库中。或者至少我不需要回购邮件public/assets
中的预编译资产。
我在heroku上发现了这个,如果没有config.assets.compile = true
,它就会在S3上找不到预编译的资产。并且heroku 必须运行所有资产的编译阶段,但随后将服务于S3。运行heroku run rake assets:precompile
不会蹲下。生产过程将重新编译所有内容。
咦?这对我来说毫无意义。
我觉得你不需要用图像填充你的回购,让你的CDN做你的工作。
我觉得这是不正确的。我是对还是错?
答案 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 与让您的应用程序懒惰地在生产中编译资产或直接在应用服务器上预编译它们相比,性能有了很大提升。不过我会说。我写了。
答案 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却遗漏了它们。
答案 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
中文件的位置,看看是否能解决问题