Specifying an Explicit ActiveRecord Version in Merb
Last night, I needed to make a quick update to my merb app’s schema. Nothing fancy. This is my first update since Rails 2.1 dropped with it’s improved migration naming scheme. For whatever reason
rake db:migrate did not work as smoothly as it did in Rails. Since I was on a short deadline I decided to revert to ActiveRecord 2.0.2 rather than debug the actual problem. I figured this ought to be pretty trivial right?
I’m still very much a Merb newbie, but it wasn’t too hard to figure out to put this in my
dependency "activerecord", "= 2.0.2"
As long as it appears before the
use_orm line it does what it’s supposed to. Well, at least it does when you run merb start. However my problem was with
rake db:migrate which now had a new problem:
can't activate activesupport (= 2.0.2), already activated activesupport-2.1.0]
I tried several solutions including requiring activesupport 2.0.2 explicitly and installing the specific gems into
./gems. Same problem. Obviously there was a problem before the Merb invocation. Turns out the
rubigen which in turn requires
Okay, no big deal, just add this somewhere above
rubigen in the
gem "activesupport", "= 2.0.2"
Now the Merb app and rake tasks work, but a quick test reveals
merb-gen is now borked same as
rake was. Same error, same cause. Problem is
ActiveSupport is required in the very first file which is part of the official release at
/usr/local/bin/merb-gen. So to actually solve this problem you need to specify the
ActiveSupport version in that executable file.
At this point I’m starting to think I should have debugged the original problem and submitted a patch to fix it, but I’ve got a working fix which is what I need right now, so I duplicate the file into my working directory and add the fix.
All this has me reflecting on the difficulties of dependency management, and the value of stable public interfaces. The general case seems very hard to manage, but I can think of some solutions at the Merb level. Hmm, maybe my first Merb patch?