我的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个因素。
答案 0 :(得分:2)
您想要考虑的一些事情:
rake assets:clobber
- Heroku的文件系统
- CDN
醇>
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