Ruby: Pravdivy pribeh
Je malo veci, na ktere bych si mohl na svem soucasnem projektu v Belgii stezovat. Jednou z nich je ale neskutecnej bordel v build systemu. Kazdej modul ma nekolik slozek lib (napr. lib-web, lib-build, lib-setup apod.) a v nich jsou rozhazeny ruzne knihovny v ruznych verzich. Dobrovolne jsem se nabidl, ze v tom udelam trochu poradek pomoci lokalni maven repository.
Abych ji mohl nejak rozumne naplnit, potreboval jsem si udelat seznam vsech knihoven (JARek) a u kazde vedet, kde a v jake verzi se pouziva. A prave tady jsem ocenil Ruby a jeho jednoduchost. Udelal jsem si v ruby skriptik, kterej mi rekurzivne proleze dany adresar a vygeneruje excelovsky soubor, ve kterem bude seznam vsech JARek, zvyrazni ty, ktere se pouzivaji v ruznych verzich, a u kazde verze mi vypise vsechny adresare, kde se nechazi. Celej skript vypada takto:
require "rubygems" require "spreadsheet/excel" include Spreadsheet class Repository def initialize(file) @row = 0 @artifacts = {} @excel_file = file end def artifact jar_file @artifacts[File.basename(jar_file)] ||= Hash.new end def version jar_file artifact(jar_file)[File.size(jar_file)] ||= Hash.new end def add jar_file version(jar_file)[File.dirname(jar_file)] = jar_file end def save workbook = Spreadsheet::Excel.new(@excel_file) @worksheet = workbook.add_worksheet("JARs") @red_style = workbook.add_format(:color=>"red") @blc_style = workbook.add_format(:color=>"black") @hdr_style = workbook.add_format(:color=>"blue", :bold=>true) @worksheet.write(0, 0, ["File Name", "Repository", "Group", "Name", "Version", "Snapshot", "Size", "Locations"], @hdr_style) @artifacts.each do|artifact| artifact[1].each do |version| put_line(artifact[0], artifact[1].size, version[0], version[1]) end end workbook.close end def put_line(name, count, size, locations) style = count == 1 ? @blc_style : @red_style @row += 1 @worksheet.write(@row, 0, name, style) @worksheet.write(@row, 3, File.basename(name, '.jar'), style) @worksheet.write(@row, 4, "1.0", style) @worksheet.write(@row, 5, 'false', style) @worksheet.write(@row, 6, size, style) @worksheet.write(@row, 7, locations.values.join(' | '), style) end end class JarExplorer def initialize(root) @root = root end def find_jars(excel_file) Dir.chdir(@root) repo = Repository.new(excel_file) Dir.glob("**/*.jar").each{|file| repo.add(file)} repo.save end end JarExplorer.new("/Users/jpisa/Workspaces").find_jars("/jars.xls")
Libi se mi na Ruby, jak jednodusse a rychle se da takovahle vec napsat a jak se da na prvni pohled neprijemna prace zautomatizovat a jeste se pri ni naucit nove veci.