【问题标题】:Public folder size is huge - digested assets - Ruby on Rails公共文件夹的大小非常大 - 已消化的资产 - Ruby on Rails
【发布时间】:2016-07-04 05:54:06
【问题描述】:

在我的 RoR 应用中,production.rb 有

MyApp::Application.configure do
  config.cache_classes = true
  config.eager_load = true
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.action_dispatch.show_detailed_exceptions = false
  # Disable Rails's static asset server (Apache or nginx will already do this).
  config.serve_static_assets = true

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier

  # Callback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = true

  # Generate digests for assets URLs.
  config.assets.digest = true

  # Version of your assets, change this if you want to expire all your assets.
  config.assets.version = '1.3'

  config.assets.prefix = "/assets-#{`git rev-parse HEAD`[0..8]}"
  config.log_level = :debug
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
  config.action_controller.perform_caching = true
end

问题出在服务器上,公用文件夹大小为 15GB。它包含许多名称如下的文件夹:

assets-2d947fb8a
assets-64bb1c0ee
assets-6b4777157
assets-33d9c439d
assets-e6f2c6c37
assets-cb3a9bc23
assets-f1e77e02d

每个文件夹都包含摘要图像、js、css 等。 那么,有没有办法自动删除/过期这些资产?

【问题讨论】:

  • 为什么要根据git版本来命名asset文件夹?仅使用“资产”有什么问题? Rails 会在生成单个资产时自动对其进行版本控制。
  • 看起来这正是问题所在。如果旧资产存在,它会使它们过期,但由于每个修订版的资产文件夹不同(HEAD 提交哈希),它变得臃肿。 (为什么?也许是缓存破​​坏?)
  • @Allolex Rails 假设config.assets.prefix 在不同版本之间是相同的,因此它会查找那里以清除旧文件,并检查是否需要生成任何文件。现在 rails 在目录中看不到任何东西,因此每次提交和运行时都会重新生成每个单一资产 rake assets:precompile
  • @shelvacu。是的,这是正确的(以及我所说的“变得臃肿”的意思)。 ;)

标签: ruby-on-rails ruby caching server asset-pipeline


【解决方案1】:

虽然非常不标准,但我不得不说,我有点喜欢这种方法,对我来说似乎比 Rails 现在使用的一个巨大的资产目录更干净。

无论如何,如果您想保留 10 个最新的资产目录并删除其他所有内容,您可以简单地创建一个 capistrano 任务(如果您使用的是 capistrano)并调用 shell 命令以使目录到期 从它,比如这个:

ls -td -- /path/to/rails/public/assets-*/ |  # list dirs, order by newest
  sed 's/.$//' |                             # remove the trailing '/'
  tail -n +10 |                              # leave out first 10 directories
  xargs rm -ri                               # delete the dirs!

使用-i 选项,删除将是交互式的,即要求您确认要删除的每个文件。将其更改为 -f 当您确定您已准备好脚本生产并且目录将被静默删除时。 SO answers here 帮助我构建了 ls 部分。

您可以将这个小“脚本”放入 capistrano 任务中,以便在部署期间预编译资产后调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2011-12-08
    • 2014-06-29
    相关资源
    最近更新 更多