Liste von Ruby GEM’s auf einen anderen Server übertragen

22. Juli 2013 von Nico Puhlmann

rubygems-install-all

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.

Dir gefällt dieser Beitrag?
Erhalte Updates. Kostenlos.

Noch keine Kommentare, sei jetzt der erste! ;)

Was denkst du?