9

我熟悉诸如Deadweight 之类的用于查找 Rails 应用程序中未使用的 CSS 的工具,但是图像是否存在任何东西?我正坐在一个项目中,其中包含与各种设计师合作的大量资产目录,并且我正在尝试减少该项目中的脂肪。将资产转移到我们的 CDN 时尤其痛苦。

有什么想法吗?

4

4 回答 4

13

这很大程度上取决于使用图像的代码。总是有可能计算文件名(通过连接两个值或字符串替换等),因此简单地按文件名进行 grepping 不一定足够。

您可以尝试运行 wget(如果您有一台 linux 机器,可能已经安装,否则http://users.ugent.be/~bpuype/wget/)来镜像您的整个站点。如果可以的话,在同一台机器或网络上执行此操作,它会抓取您的整个站点并抓取所有图像

# mirror mysite.com accepting only jpg, png and gif files
wget -A jpg,png,gif --mirror www.mysite.com

完成此操作后,您将获得站点层次结构的第二个副本,其中包含通过爬网可访问的任何页面主动链接到的任何图像。然后您可以备份您的源图像目录,并将其替换为 wget 的副本。接下来,监视与 gif/jpg/png 文件有关的 404 日志文件。希望有帮助。

于 2010-01-06T02:32:59.167 回答
11

查找 unsed 图像应该比 CSS 更容易。

只需使用 glob 找到 *.jpg *.png *gif,将这些文件名放入字典或数组中,然后在 html、css、js 文件中找到这些文件名,如果找到则删除文件名,您将获得未使用的列表,并将这些图像移动到另一个文件夹具有相同的目录结构(以防万一,这将有利于恢复)

基本上是这样的,当然对于加密/编码/混淆的文件名将不起作用。

require "fileutils"

img=Dir.glob("**/*.jpg")+Dir.glob("**/*.png")+Dir.glob("**/*.gif")
data=Dir.glob("**/*.htm*")+Dir.glob("**/*.css")+Dir.glob("**/*.js")

puts img.length.to_s+" images found & "+data.length.to_s+" files found to search against"

content=""
data.each do |f|
    content+=File.open(f, 'r').read   
end

img.each do |m|
    if not content=~ Regexp.new("\\b"+File.basename(m)+"\\b")
        FileUtils.mkdir_p "../unused/"+File.dirname(m)
        FileUtils.mv m,"../unused/"+m
        puts "Image "+m+" moved to ../unused/"+File.dirname(m)+" folder"
    end
end

PS:我用过fileutils,因为正常makedirsmv在我的 Windows 版本的 ruby​​ 中不起作用

而且我不擅长红宝石,所以请在使用前仔细检查。

这是我在 Windows 的 sample rails 文件夹的根文件夹中运行的示例结果

---\ruby>ruby img_coverage.rb
5 images found & 12 files found to search against
Image depot/public/images/test.jpg moved to ../unused/depot/public/images folder
于 2010-01-06T02:03:29.570 回答
6

如果您的图像 URL 通常来自许多计算/连接的字符串和其他难以在源代码中以编程方式跟踪的内容,并且您的应用程序正在大量使用,您可以尝试这样的软“蜜罐”方法:

  • 将所有资产移动到不同的目录,例如/attic
  • 设置一个空/images目录(或您的资产目录的名称)
  • 设置一个.htaccess文件(如果你当然在 Apache 上),使用该-f标志,将所有对不存在的图像文件的请求重定向到脚本
  • 该脚本将请求的文件从复制/attic/images目录中并显示它
  • 对该图像的下一个请求将直接转到该图像,因为它现在存在

经过一段时间和足够的使用后,所有需要的图像应该已经复制到资产目录。

这当然是一种“软”方法,因为在此期间任何用户都可能没有打开/输入/使用对话框/情况(例如错误消息图标之类的东西)。但它会识别所有使用过的文件,无论它们是从哪里请求的,并且可能有助于整理出许多不需要的文件。

于 2010-01-06T22:39:19.167 回答
2

如果您的文件管理器支持它,请尝试按文件的“上次访问”日期对图像目录进行排序。长时间未访问的文件很可能不再使用。

同样,您还可以通过 Web 服务器的日志进行过滤或 grep,并列出它在过去几个月中提供的图像文件。不在此列表中的任何图像都可能未使用。

于 2010-01-06T22:28:37.940 回答