ConvertingGems

Piotr Czapla edited this page Aug 4, 2015 · 8 revisions

Converting rubygems

Simplest possible invocation:

% cd /tmp
% fpm -s gem -t deb json
...
Created /tmp/rubygem-json-1.4.6-1.amd64.deb

This will download the latest 'json' rubygem from rubygems.org and convert it to a .deb. It will create a package named 'rubygem-json-VERSION_ARCH.deb' with appropriate version/arch in place.

Check the package:

% dpkg --info rubygem-json-1.4.6-1.amd64.deb 
 new debian package, version 2.0.
 size 1004040 bytes: control archive= 335 bytes.
     275 bytes,    10 lines      control              
       5 bytes,     1 lines      md5sums              
 Package: rubygem-json
 Version: 1.4.6-1
 Architecture: amd64
 Maintainer: Florian Frank
 Standards-Version: 3.9.1
 Section: Languages/Development/Ruby 
 Priority: extra
 Homepage: http://flori.github.com/json
 Description: JSON Implementation for Ruby
   JSON Implementation for Ruby

From the above, you can see that fpm automatically picked the package name, version, maintainer, section, homepage, and description all from the rubygem itself. Nothing for you to worry about :)

Simple example with version and auto-dependencies

You can ask for a specific version with '-v '. It will also handle dependencies. How about an older gem like rails 2.2.2?

% fpm -s gem -t deb -v 2.2.2 rails
Trying to download rails (version=2.2.2)
...
Created .../rubygem-rails-2.2.2-1.amd64.deb

Now observe the package created:

% dpkg --info ./rubygem-rails-2.2.2-1.amd64.deb
 new debian package, version 2.0.
 size 2452008 bytes: control archive= 445 bytes.
     575 bytes,    11 lines      control              
       6 bytes,     1 lines      md5sums              
 Package: rubygem-rails
 Version: 2.2.2-1
 Architecture: amd64
 Maintainer: David Heinemeier Hansson
 Depends: rubygem-rake (>= 0.8.3), rubygem-activesupport (= 2.2.2),
   rubygem-activerecord (= 2.2.2), rubygem-actionpack (= 2.2.2),
   rubygem-actionmailer (= 2.2.2), rubygem-activeresource (= 2.2.2)
 Standards-Version: 3.9.1
 Section: Languages/Development/Ruby 
 Priority: extra
 Homepage: http://www.rubyonrails.org
 Description: Web-application framework with template engine, control-flow layer, and ORM.
   Web-application framework with template engine, control-flow layer, and ORM.

(The 'depends' line above wrapped for readability)

What does the package install?

dpkg -c ./rubygem-rails-2.2.2-1.amd64.deb
...
drwxr-xr-x root/root         0 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/
drwxr-xr-x root/root         0 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/
-rw-r--r-- root/root      3639 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/source_annotation_extractor.rb
-rw-r--r-- root/root       198 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/performance_test_help.rb
drwxr-xr-x root/root         0 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/
-rw-r--r-- root/root       204 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/log.rake
-rw-r--r-- root/root      2695 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/gems.rake
-rw-r--r-- root/root      4858 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/testing.rake
-rw-r--r-- root/root     17727 2011-01-20 17:00 ./usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/databases.rake

Convert a gem and all of its dependencies

First we'll have to download the gem and its deps. The easiest way to do this is to stage the installation in a temporary directory, like this:

% mkdir /tmp/gems
% gem install --no-ri --no-rdoc --install-dir /tmp/gems cucumber
<output trimmed>

Successfully installed json-1.4.6
Successfully installed gherkin-2.3.3
Successfully installed term-ansicolor-1.0.5
Successfully installed builder-3.0.0
Successfully installed diff-lcs-1.1.2
Successfully installed cucumber-0.10.0
6 gems installed

Now you've got everything cucumber requires to run (just as a normal 'gem install' would.)

'gem' saves gems to the cache directory in the gem install dir, so check it out:

 % ls /tmp/gems/cache 
 builder-3.0.0.gem    diff-lcs-1.1.2.gem  json-1.4.6.gem
 cucumber-0.10.0.gem  gherkin-2.3.3.gem   term-ansicolor-1.0.5.gem

(by the way, under normal installation situations, gem would keep the cache in a location like /usr/lib/ruby/gems/1.8/cache, see 'gem env | grep INSTALL')

Let's convert all these gems to debs (output trimmed for sanity):

% find /tmp/gems/cache -name '*.gem' | xargs -rn1 fpm -d ruby -d rubygems --prefix $(gem environment gemdir) -s gem -t deb
...
Created /tmp/gems/rubygem-json-1.4.6-1.amd64.deb
...
Created /tmp/gems/rubygem-builder-3.0.0-1.amd64.deb
...
Created /tmp/gems/rubygem-gherkin-2.3.3-1.amd64.deb
...
Created /tmp/gems/rubygem-diff-lcs-1.1.2-1.amd64.deb
...
Created /tmp/gems/rubygem-term-ansicolor-1.0.5-1.amd64.deb
...
Created /tmp/gems/rubygem-cucumber-0.10.0-1.amd64.deb

% ls *.deb
rubygem-builder-3.0.0-1.amd64.deb    rubygem-gherkin-2.3.3-1.amd64.deb
rubygem-cucumber-0.10.0-1.amd64.deb  rubygem-json-1.4.6-1.amd64.deb
rubygem-diff-lcs-1.1.2-1.amd64.deb   rubygem-term-ansicolor-1.0.5-1.amd64.deb

Nicely, eh?

How about installing them?

# Show it's not install yet:
% gem list cucumber

*** LOCAL GEMS ***


# Now install the .deb packages:
% sudo dpkg -i rubygem-builder-3.0.0-1.amd64.deb \
  rubygem-cucumber-0.10.0-1.amd64.deb rubygem-diff-lcs-1.1.2-1.amd64.deb \
  rubygem-gherkin-2.3.3-1.amd64.deb rubygem-json-1.4.6-1.amd64.deb \
  rubygem-term-ansicolor-1.0.5-1.amd64.deb
...
Setting up rubygem-builder (3.0.0-1) ...
Setting up rubygem-diff-lcs (1.1.2-1) ...
Setting up rubygem-json (1.4.6-1) ...
Setting up rubygem-term-ansicolor (1.0.5-1) ...
Setting up rubygem-gherkin (2.3.3-1) ...
Setting up rubygem-cucumber (0.10.0-1) ...

# Is it installed?
% gem list cucumber

*** LOCAL GEMS ***

cucumber (0.10.0)

# Does it work?
% dpkg -L rubygem-cucumber | grep bin
/usr/lib/ruby/gems/1.8/gems/cucumber-0.10.0/bin
/usr/lib/ruby/gems/1.8/gems/cucumber-0.10.0/bin/cucumber
/usr/lib/ruby/gems/1.8/bin
/usr/lib/ruby/gems/1.8/bin/cucumber

% /usr/lib/ruby/gems/1.8/bin/cucumber --help
Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+
...

You can put these .deb files in your apt repo (you have a local apt repo, right?) and easily install them with 'apt-get' like: 'apt-get install rubygem-cucumber' and expect dependencies to work nicely.