Wer viel mit Ruby und Ruby on Rails arbeitet, kommt an Rubygems nicht vorbei. Was PEAR und Pecl für PHP und CPAN für Perl ist, ist Rubygems für Ruby: ein Paketsystem zum Installieren und Verwalten von Ruby-Modulen (Software, Librarys und Bibliotheken). Da es in Ruby für fast alles eine Library gibt und man sich mit Hilfe einer solchen Library viel Arbeit ersparen kann, kommt mit der Zeit eine ganz schöne Liste von installierten GEM’s zusammen, die bei komplexen Anwendungen durchaus auch mal dreistellig werden kann. Möchte man die Anwendung oder gleich mehrere nun auf einen neuen oder anderen Server installieren, müsste man entweder per Rake oder Bundler die Abhängigkeiten jeder einzelnen Rails-Anwendung auflösen oder jedes GEM einzeln per Hand installieren. Letzteres fällt bei einer großen Anzahl von GEM’s jedoch flach und wäre zu viel Aufwand. Abhilfe schafft hier ein kleines Perl-Script, welches alle installierten Pakete inklusive aller Versionen durchgeht und pro Version eine Install-Anweisung ausgibt.
Folgendes Script auf dem alten Server unter dem Namen „listgems.pl“ erstellen:
#!/usr/bin/perl -w # We're strict use strict; # Get list of installed gems my @gems = qx(gem list); chomp(@gems); # Create commands foreach my $gem (@gems) { # Match gem and versions $gem =~ m/(\S+)\s\((.+)\)/i; # Gem name $gem = $1; # Save them into array my @gem_versions = split(/,/, $2); # Print out commands foreach (@gem_versions) { # Remove all whitespaces $_ =~ s/^\s+//; print "gem install $gem --version=$_\n"; } }
Nach dem Ausführen sollte ungefähr folgende Ausgabe erscheinen:
user@box:~# perl listgems.pl
gem install actionmailer --version=2.3.5
gem install actionpack --version=2.3.5
gem install activerecord --version=2.3.5
gem install activeresource --version=2.3.5
gem install activesupport --version=2.3.5
gem install addressable --version=2.2.6
gem install cgi_multipart_eof_fix --version=2.5.0
gem install chardet --version=0.9.0
gem install crack --version=0.1.8
gem install daemons --version=1.1.4
gem install fastercsv --version=1.5.4
gem install fastthread --version=1.0.7
gem install gem_plugin --version=0.2.3
gem install gemcutter --version=0.7.0
gem install hashie --version=1.0.0
gem install hpricot --version=0.8.6
gem install httpclient --version=2.2.3
..
gem install ruby-hmac --version=0.4.0
gem install Ruby-MemCache --version=0.0.1
gem install simple_oauth --version=0.1.5
gem install soap4r --version=1.5.8
gem install zanox --version=0.2.7
gem install zip --version=2.0.2
Diese Liste nun auf dem neuen Server als Bash-Script speichern:
user@box:~# vi install_gems.sh
Jetzt einfach die auf dem alten Server generierte Liste per Copy und Paste einfügen und ausführen:
user@box:~# bash install_gems.sh
Fetching: activesupport-2.3.15.gem (100%)
Fetching: rack-1.1.6.gem (100%)
Fetching: actionpack-2.3.15.gem (100%)
Fetching: actionmailer-2.3.15.gem (100%)
Successfully installed activesupport-2.3.15
Successfully installed rack-1.1.6
Successfully installed actionpack-2.3.15
Successfully installed actionmailer-2.3.15
4 gems installed
Installing ri documentation for activesupport-2.3.15...
Installing ri documentation for rack-1.1.6...
Installing ri documentation for actionpack-2.3.15...
Installing ri documentation for actionmailer-2.3.15...
Installing RDoc documentation for activesupport-2.3.15...
Installing RDoc documentation for rack-1.1.6...
Installing RDoc documentation for actionpack-2.3.15...
Installing RDoc documentation for actionmailer-2.3.15...
..
Nun sollten alle auf dem alten Server vorhanden GEM’s auf dem neuen installiert werden.
Wer kein Perl zur Hand hat oder eine kürzere Variante sucht, der kann folgenden Einzeiler in Bash ausführen.
user@box:~# gem list|sed 's/(//'|sed 's/)//'|sed 's/,//'|awk '{print "gem install " $1 " --version=" $2}'
Aber Achtung! Hier werden keine Versionen berücksichtigt, sondern immmer nur die erste Version ausgegeben. Das Bash-Script sollte also nur verwendet werden, wenn pro Paket auch nur eine Version installiert ist.
Dies ist eine freie Übersetzung und überarbeitete Version des Original-Posts von Artur Krzywanski. Vielen Dank.
Was denkst du?