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
Dagi3d muchas gracias por la ayuda!, durante el fin de semana lo probare y te cuento. Saludos!