项目开发中,经常会用到的图片进行修改,而CDN都会对图片做cache,如果图片更新了不做其他处理的话,用户端的图片则无法更新(删浏览器cache刷新除外)。
因此每次修改完图片,都需要去更新css所引用的图片url。通常的做法是给图片后面加个时间戳,如:./images/sprite.png?20120714001。但是人工修改这东西是个挺蛋疼的事,咱是程序员, 不应该干这些繁杂无趣的事对不对。
所以阿拉整了个python脚本来干这事(貌似最近写脚本写上瘾了,汗-_-||)。原理是读取css文件,遍历图片url,然后读取图片的svn版本跟url带的版本号比较。如果比较新则更新url。
用法:把脚本放到项目目录(推荐),然后指定inputDir为css文件的目录,用python执行它就行啦。如果有发布编辑脚本,也可以加入到发布脚本里面。
脚本代码如下,注释已经比较详细了。more
#auto update the timestamp of image url
import re
import os
#css文件的目录放在这里,该脚本可以放在项目的根目录
inputDir = './css/'
p = re.compile('url\([\'\"]?((.+?)\.(png|jpg|jpeg|gif))[\'\"]?\)',re.I)
revRegex = re.compile('Last Changed Rev: (\d+)')
#从url读取时间戳
def getTimestampArr(url):
i = url.find('?')
if i != -1:
m = url.split('?')
return m
else:
return [url, 0]
#根据传入url,读取svn的文件版本号
def getLastModifyVer(url):
cmd = 'svn info ' + url
ret = os.popen(cmd)
info = ret.read()
#svn 的版本只能通过提取svn info的信息
ver = revRegex.findall(info)
if ver:
ver = ver[0]
else:
ver = 0
return ver
files = os.listdir(inputDir)
cssFiles = []
#find all css files
for f in files:
f = f.lower()
if f.endswith('.css'):
cssFiles.append(f)
#read all image url and compare the timestamp
for f in cssFiles:
out = open(inputDir + f, 'r+')
content = out.read()
m = p.findall(content)
if m:
replaceCache = {}
for u in m:
u = u[0]
#如果图片的url是绝对路径,则可能是不在svn版本库的,干脆不处理
if u.startswith('http://'):
continue
tarr = getTimestampArr(u)
oldT = tarr[1]
newT = getLastModifyVer(inputDir + u)
#if modified, change the timestamp
if newT > oldT and (not replaceCache.has_key(u)):
newUrl = tarr[0] + '?' + newT
content = content.replace(u, newUrl)
replaceCache[u] = 1
else:
continue
#write to file
out.seek(0)
out.write(content)
out.close()