When installing Merb on my laptop, which runs Ubuntu Linux, I ran into a compiler error with hpricot, one of Merb’s dependencies. Before bothering to see what might be causing it, I checked to see if there was a precompiled apt-get package available. There was! I installed it and tried installing Merb again.
It still tried to install hpricot, however, and when I said to skip it, it said it could not install Merb because it was missing hpricot. I could have used force, or “pretty please”, but I wanted to instead tell the packaging system that I have hpricot installed.
I seem to remember a UNIX packaging system having an inject command — which tells the packaging system a program is already installed. I may have got the terminology wrong. I searched for such a command for rubygems but couldn’t find one. I did, however, find another way to convince rubygems that I already had hpricot.
I decided to do some digging in the gems directory. To find the gems directory, I typed:
ben@magicthise:~$ gem environment RubyGems Environment: - VERSION: 0.9.4 (0.9.4) - INSTALLATION DIRECTORY: /var/lib/gems/1.8 - GEM PATH: - /var/lib/gems/1.8 - REMOTE SOURCES: - http://gems.rubyforge.org ben@magicthise:~$ cd /var/lib/gems/1.8/ ben@magicthise:/var/lib/gems/1.8$ ls bin cache doc gems source_cache specifications ben@magicthise:/var/lib/gems/1.8$ cd specifications/ ben@magicthise:/var/lib/gems/1.8/specifications$ ls abstract-1.0.0.gemspec merb-cache-0.9.2.gemspec actionmailer-2.0.2.gemspec merb-core-0.9.2.gemspec ... ben@magicthise:/var/lib/gems/1.8/specifications$
I took a look at the gemspec files and found that they contained the name and version of the library. I copied the smallest of the files to hpricot-0.6.gemspec and used the gemspec documentation to find out which parameters are required. I wound up with the following in /var/lib/gems/1.8/specifications/hpricot-1.6.rb.
Gem::Specification.new do |s| s.name = %q{hpricot} s.version = "0.6" end
I tried running:
ben@magicthise:~$ gem install merb --include-dependencies
And it worked!
It might not be everything that’s needed to get it working — but now I at least know how to inject a package.