如何删除heroku上的旧rails资产?

时间:2014-09-09 02:54:24

标签: ruby-on-rails caching heroku config assets

我的rails应用程序正在运行,但它的大小很大(220mb)。 我使用config.assets.digest = true和config.action_controller.asset_host =“something.cloudfront.net”

将所有资产存储在cloudfront上
  

heroku run bash

在slug中,公共/资产中有30次application-onedigest.js,而样式表和图像则相同,所以现在slug大小为220 mb。

也许我的一个宝石正在做中间件事情(Rails asset_host, cloudfront and heroku)或者heroku正在尝试优化事物(https://devcenter.heroku.com/changelog-items/328),但我不这么认为。我不想超过300 mb的最大heroku slug大小,我觉得这不正常。

如何删除heroku上的旧rails资产?

修改 我在一个css文件中做了一些提交,推送到heroku,并比较了slug。在部署过程中,有以下几行:

Running: rake assets:precompile
INFO -- : Writing /tmp/build_ff4eb6d7-303e-444d-9c88-938ab504ea8a/public/assets/application-700c7e1849c55312a94a353e60312500.css
Asset precompilation completed (9.60s)
Cleaning assets
Running: rake assets:clean
INFO -- : Removed application-48375ba5495e14b36afab9d4b9d97033.css

这就是我想要的。但是,当我比较旧的和新的slug时,有新的application-700....css和另一个新的神秘application-a9b33ae58934ad161038cb3ebcee146c.css 实际使用的是heroku webapp(当我在清除缓存后从浏览器中浏览css资源时)。 所以我想预编译在某个地方完成了两次?

临时解决方案:heroku fork应用程序,我回到了40 MB,但仍然存在问题。

修改 它似乎在我本地预编译时有效,但我不喜欢它,因为它违反了12个因素。

4 个答案:

答案 0 :(得分:2)

您想要考虑的一些事情:

  
      
  1. rake assets:clobber
  2.   
  3. Heroku的文件系统
  4.   
  5. CDN
  6.   

rake assets:clobber 是一种从public/assets目录中删除旧资产文件的内置方法。通过在本地或Heroku上运行此命令,您将能够主动删除系统上的预编译资产文件,允许您使用新文件重新填充文件夹

其次,您必须记住 Heroku runs an ephemeral file system 。这意味着每次将应用程序推送到Heroku时,它都会覆盖您之前拥有的任何文件,这意味着(重要的是)它不会存储您的最后一个资产。每次推送时,它都会为您预编译资产 - 这应该确保最小的空间。

-

最后,如果您发现自己的资产在应用服务器上占用了太多空间,则可以考虑使用content delivery network (CDN)来提供所需的资源。您可以使用asset_sync gem将资源推送到您选择的CDN

大多数人倾向于使用带存储系统的CDN来为其资产提供服务。我们目前使用S3与Cloudfront,但希望转向Rackspace的文件服务系统!

答案 1 :(得分:1)

您可以使用Heroku repo插件(https://github.com/heroku/heroku-repo)和repo:purge命令清除子弹中的所有构建资产。

使用asset_sync gem并不理想,因为您可能会遇到部署超时,将所有资产推送到S3以及最终将资产放在两个位置。请记住,S3不是内容交付网络,您最好使用CloudFront分配,并让它直接从您的应用程序缓存资产。有关详细信息,请参阅https://devcenter.heroku.com/articles/using-amazon-cloudfront-cdn

答案 2 :(得分:0)

这在生产中解决了它.rb:

config.assets.compile = false

Heroku不再产生无用的资产。我不知道如何在同一个heroku应用程序中删除旧资产,但我使用了" heroku fork"使用相同的配置/数据库创建一个全新的heroku应用程序,没有旧资产。

答案 3 :(得分:0)

heroku运行rake资产:clobber