ruby-on-rails - 多次部署后的 Heroku Slug 大小

标签 ruby-on-rails heroku

我有一个 Ruby on Rails 非常接近 slug 大小限制 (300mb) 的应用程序。我用 .slugignore 尽可能地减小了大小但还没有得到我想要的结果。

一时兴起,我尝试创建一个新的赫罗库 应用程序并向其部署了相同的 git 存储库。瞧,它远低于(仅 80mb 208mb )。在访问 bash 并检查每台服务器的大小时,我注意到服务器之间存在一些差异:

du -hs *
130M (old) vs 1.4M (new) public
23M (old) vs 5.3M (new) tmp
...

是什么赋予了?在 Heroku 上,用户是否应该在足够的部署通过后销毁和重新创建应用程序?我查看了公共(public)目录,它保留了各种旧的已删除 Assets 和垃圾。我怎样才能清理我现有的应用程序而不破坏它并从头开始?

最佳答案

这可能与 Rail 试图在部署过程中避免问题有关。目标是避免部署期间的停机和/或错误。您的代码不会立即部署到所有服务器。 Rails 的解决方案是允许 Assets 的多个版本同时存在。典型的流程是:

%> rake assets:precompile  # To build new assets
%> rake assets:clean       # Remove old assets

rails keeps 2 previous versions Assets (默认情况下)。根据应用程序,您可能需要一段时间的旧 Assets 。例如,如果您有一个繁重的 JavaScript 应用程序,它会一次性获取资源,然后通过 XHR 动态更新。在客户端运行的旧代码可能会引用其他旧资源。即使使用非客户端繁重的应用程序,您也可能有几秒钟的时间,其中一些节点引用旧 Assets ,而一些节点引用新 Assets 。

这可以解释一些原因 public 在您的旧应用程序上更大。它本质上具有所有 Assets 的三个版本,而您的新部署只有一个。听起来你的构建环境肯定有什么问题,因为即使你的所有 Assets 都占用了新应用程序中的 1.4MB,该大小的三倍应该只有大约 5MB,而不是旧应用程序中的 130MB。

除了拥有你的 Assets 的三个版本之外,在 tmp 目录下也有一些积累。 Assets 编译过程会在 tmp 目录中缓存一些信息。 Rails 有一个 rake tmp:cache:clear您可以定期运行以清除那里的杂物。

赫罗库 automatically runs rake assets:clean .所以这应该只保留三个版本的 Assets 。但是 Heroku 实际上并没有运行 rake tmp:cache:clear .相反,他们have some custom code删除缓存文件,直到缓存数据低于 50MB。我假设他们这样做是为了保留尽可能多的缓存信息,同时仍然限制内容。保留尽可能多的缓存数据可能会确保 Assets 编译运行快速。这意味着您的 tmp 目录将继续增长,直到达到 50MB。

如果您的 public/assets 目录增长超过 3 个版本或 tmp 目录中的 50MB 太多了,那么创建一个新应用程序是清除问题的好方法。你也可以create a custom slug .刚刚运行rake assets:cleanrake tmp:cache:clear在 heroku 控制台上不起作用。那只会清理测功机上的东西,而不是你的蛞蝓。因此,当创建新的测功机时,您的清洁工作将被丢弃。

关于ruby-on-rails - 多次部署后的 Heroku Slug 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440357/

相关文章:

ruby-on-rails - 使用 Grape API 和 Heroku 的 CORS 问题

grails - 为Heroku Grails应用程序配置根URL

ruby-on-rails - 如何使用 Pundit 限制对用户资源索引操作的授权?我认为答案不是范围

ruby-on-rails - file_field 浏览按钮自定义

ruby-on-rails - rails 3 : Lazy loading versus eager loading

swift - 尝试保存 PFUser 后解析已销毁的 session

python - 在不使用上下文的情况下发送消息的替代方法是什么?

ruby-on-rails - Rails Guides 离线文档

sql - rails - 如何从另一个查询中减去一个查询?

amazon-web-services - Elastic Beanstalk (EB) 默认地址/URL 上的 HTTPS(无自定义域名)