刚刚接触ruby不就,总想拿过来写点什么,正好公司里有个项目需要把原来的branch目录里面pom文件的一部分内容更新出去,于是试着用ruby写了一下这段脚本(只贴出了核心的那部分)
Dir.foreach(url){|e|
if e=="."||e==".."||e=="target" then next end
_f=url+"\\"+e
if e=="pom.xml" then @poms<<_f end
if File.directory? _f then _loadPom _f end
}
foreach 这个命令用的比较舒服,不像java 那样需要遍历目录结构 ,在ruby里面一条命令就可以了。Dir会把. 和.. 也作为一个目录结构,这里需要把它删除,同时由于项目里面用到了maven来构建,所以target也是不需要扫描的,定义了一个@pom来存放所有的pom 文件。如果是子目录的话就用递归。
@poms.each{|pom|
#search and replace
file=File.read(pom)
if file.scan(/(#{@oldV})/).length<=0 then next end
buffer=file.gsub(/#{@oldV}/,@newV)
if not File.writable? pom then
#check out the file first
File.open(pom).chmod(0755)
end
f=File.write(pom,buffer)
a+=1
}
遍历刚才发现的pom文件,file.scan 会先判断文件内容是否有需要替换的内容,如果没有则继续执行下一个文件,否则 file.gsub 执行搜索和替换。gsub是String 类的一个很有用的方法。替换好以后,在打开同一个文件,把修改好的内容替换在里面。这里File.read 和 File.write 用的很舒服。
这里比较有意思的是file.gsub(/(#{@oldV})/,@newV) ,里面@oldV和@newV是自定义的内部变量,用来保存查找和替换的内容。而#{@oldV} 是ruby的语法用来实现表达式替换的作用,例如
person="jack"
p "hello #{person}"