Dagi3d v4

Comparar gemas instaladas en desarrollo y producción

A raíz de un post en el blog de Nicolás Orellana, donde mencionaba el problema de no tener sincronizadas las gemas instaladas en la máquina de desarrollo con las que deberían estar también en la máquina de producción, me animé a escribir una pequeña tarea para Capistrano que intentase resolver este problema. La idea en principio era sencilla, tan sólo habría que obtener la lista de gemas instaladas en local utilizando el comando 'gem list' tal como mencionaba Nicolás, hacer lo mismo en remoto, compararlas para ver las diferencias y luego ofrecer la posibilidad de instalar aquellas que no estuviesen en la máquina de producción.

Y esta fue la solución a la que llegué (de momento no hace ningún control sobre las versiones, pero si tengo un rato intentaré completarla):

task :compare_gems do
  
  def parse_gem_line(line, gems)
    if line =~ /^([[:alnum:]]+)\s\((.*)\)/
      gem = $1
      gems[gem] = []
      versions = $2.gsub(/\s/, '').split(",")
      gems[gem] << versions
    end
  end
  
  local_gems = {}
  remote_gems = {}
  
  local_gem_list = %x{gem list}
  local_gem_list.each_line { |line| parse_gem_line(line, local_gems)}

  run "gem list" do |channel, stream, data|
    parse_gem_line(data, remote_gems)
  end
  
  not_installed_gems = local_gems.dup
  
  not_installed_gems.delete_if {|key, value| remote_gems.has_key? key }
  
  puts "== Not installed gems =="
  
  not_installed_gems.each_key do |gem|
    
    puts "* #{gem}"
    puts "Install? [yN]"
    answer = STDIN.gets.chomp
    
    if answer.downcase == "y"
      run "gem install #{gem} -y" do |channel, stream, data|
        puts data
        if data =~ /^>/
          install_option = STDIN.gets.chomp
          channel.send_data "#{install_option}\n"
        end
      end
    end
  end
  
  puts "========================"
end

Nico Orellana
21/07/2007 18:48

Dagi3d muchas gracias por la ayuda!, durante el fin de semana lo probare y te cuento. Saludos!

Deja un comentario
*: campos obligatorios. La dirección de correo no será publicada