在Rails应用程序中查找未使用的图像?

时间:2009-12-22 23:01:39

标签: ruby-on-rails image assets

我熟悉像Deadweight这样的工具,用于查找未在Rails应用程序中使用的CSS,但是对于图像是否存在任何问题?我正坐在一个拥有大量资产目录的项目中,与各种设计师合作,我正在努力减少这个项目的成本。将资产转移到我们的CDN时尤其痛苦。

有什么想法吗?

4 个答案:

答案 0 :(得分: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。希望有所帮助。

答案 1 :(得分:11)

查找未经图像的图像应该比CSS更容易。

只需找到* .jpg * .png * gif with glob,将这些文件名放到字典或数组中,再找到那些文件名html,css,js文件,删除文件名如果找到并且你将获得未使用的列表,并移动这些图像到另一个具有相同目录结构的文件夹(最好还原以防万一)

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

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

中的示例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

答案 2 :(得分:6)

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

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

经过一段时间和充分的使用后,所有所需的图像都应该被复制到资产目录。

当然,这是一种“软”方法,因为在此期间任何用户都无法打开/输入/使用对话框/情境(例如错误消息图标等)。但它会识别所有使用过的文件,无论它们在何处被请求,并且可能有助于理清大部分不需要的文件。

答案 3 :(得分:2)

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

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