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

mwi*_*ams 9 assets ruby-on-rails image

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

有什么想法吗?

mea*_*gar 13

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

您可以尝试运行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
Run Code Online (Sandbox Code Playgroud)

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

  • wget无法抓取整个网站,身份验证背后的各个页面.它需要是在Rails本身的帮助下构建的解决方案,因为我们首先使用它的帮助器来显示图像. (2认同)

YOU*_*YOU 11

查找未映射的图像应该比CSS更容易.

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

基本上这样,当然加密/编码/ obcuscated的文件名不起作用.

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
Run Code Online (Sandbox Code Playgroud)

PS:我用过fileutils,因为正常makedirs而且mv不适用于我的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
Run Code Online (Sandbox Code Playgroud)


Pek*_*ica 6

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

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

经过一段时间和足够的使用后,所有需要的图像都应该被复制到assets目录中.

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