我可以在资产编译后删除 Heroku 上的应用程序/资产以减少 slug 大小吗

Posted

技术标签:

【中文标题】我可以在资产编译后删除 Heroku 上的应用程序/资产以减少 slug 大小吗【英文标题】:Can I remove app/assets on heroku after asset compilation to reduce slug size 【发布时间】:2013-11-18 23:13:28 【问题描述】:

只是一个思考。如果您使用asset_sync gem 编译资产并且不回退让sprockets 在运行时编译,您是否可以使用.slugignore 从您的slug 中删除app/assets 文件夹以减小slug 大小?

我已经测试过,预编译的资产不再使用资产管道提供服务。 Rails 必须查找 app/assets 文件夹,如果它不可用,就会变得脾气暴躁,默认为按需编译。

其他人尝试过这种效果吗?我发现的唯一一件事是在 slug-ignore 之后调用 build backs,所以如果我使用涡轮链轮,它可能会破坏部署之间的缓存。

【问题讨论】:

我没有尝试这样做,但我相信 Heroku 上的预编译资产存储在资产管道中的/public/assets 中......不过,这是一个有趣的想法。 好点CDub。这意味着有两种资产来源本质上是自重的。如果我们从资产主机提供所有资产,则永远不会访问 app/assets 文件夹和 public/assets 文件夹。 宾果游戏。睡了之后,我在想,如果你在部署之前执行rake assets:precompile,你可以忽略部署到 Heroku 的所有资产管道......想法? 我在同一页面上,但我意识到使用编译后挂钩销毁所有资产可能更容易。 我不确定这是否与 Heroku 挂钩。如果可以的话,我很想知道怎么做。 【参考方案1】:

this post 对此有一个很好的解决方案,即后预编译任务。我对其进行了修改以删除所有内容,包括 app/assets 文件。对于某些人来说,这可能有点激烈,但这是一种减少杂物的简单方法。

这将我的 slug 大小减少了 20mb。

Rake::Task["assets:precompile"].enhance do
  return "can't run in dev" if Rails.env.development?
  puts 'my assets:precompile hook is started!'
  ["#Dir.pwd/public/", "#Dir.pwd/app/assets/"].each do |dir_path|
    records = Dir.glob("#dir_path**/*")
    records.each do |f|
      if f =~ /.*.png$/ or
        f =~ /.*.jpg$/ or
        f =~ /.*.gif$/ or
        f =~ /.*.ico$/ or
        f =~ /.*.eot$/ or
        f =~ /.*.svg$/ or
        f =~ /.*.woff$/ or
        f =~ /.*.ttf$/ or
        f =~ /.*.otf$/ or
        f =~ /.*.css$/ or
        f =~ /.*.js$/ or
        f =~ /.*.sass$/ or
        f =~ /.*.css$/ or
        f =~ /.*.scss$/ or
        f =~ /.*.coffee$/ or
        f =~ /.*.wav$/ then
        File.delete(f)
        puts "removing #f"
      end
    end
    puts Dir.glob("#dir_path**/*")
  end
  puts 'my assets:precompile hook is finished!'
end

【讨论】:

【参考方案2】:

段塞尺寸太大的原因有很多。最常见的 3 个是:

额外/未使用的宝石 Tmp 缓存 通过 .slugignore 处理大型资产

我花了大约 3 个小时来研究为什么我的蛞蝓尺寸太大的所有可能性。

我需要的gem 文件中的所有gem,所以都没有了。 我尝试通过https://devcenter.heroku.com/articles/slug-compiler 使用 .slugignore,这有点帮助。

对我来说最终的解决方案是忽略其他环境中的资产。

为此,打开 application.rb 并添加:

config.assets.configure do |env| if Rails.env.development? || Rails.env.test? env.cache = ActiveSupport::Cache.lookup_store(:memory_store)

这将忽略从其他环境中提取的任何额外缓存。 如果要部署到 heroku,在预编译之前,运行: heroku config:set BUNDLE_WITHOUT="development:test"。之后,运行您的常规git push heroku master

如果您回顾日志,您会注意到它直接跳过了开发和测试。这将我的 slug 大小减少了 50mb 以上。我希望这对某人有帮助!

【讨论】:

以上是关于我可以在资产编译后删除 Heroku 上的应用程序/资产以减少 slug 大小吗的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 Rails 3.2 资产编译问题

Rake 资产:Heroku 错误上的预编译

Heroku 上的“application.css 未预编译”错误,CDN 上有远程资产

远程:!预编译资产失败。在heroku上(Rails 6和语义UI)

在 Heroku 上预编译资产时如何普遍跳过数据库接触

导致资产预编译在heroku部署上失败的代码片段