top | item 5370156

Use Bundler.setup Instead of Bundler.require

13 points| anti-pattern | 13 years ago |anti-pattern.com

14 comments

order

stormbrew|13 years ago

In a language with a more rigid module system I'd agree with this, but Ruby's is really problematic for this sort of thing. Your requires will eventually cease to be documentation as they go stale, and you'll almost certainly accidentally use a dependency you don't require. All of this results in Weird Dependency Failures At A Distance.

If there's one thing I wish Ruby would adopt from python it's the import namespace system. Then this kind of proposal would become more practical.

anti-pattern|13 years ago

Interesting. Why would the requires go stale? And how would you use a dependency you don't require? It wouldn't be possible to use it unless you required it. This of course assumes you're testing your classes in isolation.

suckaplease|13 years ago

Wow, I'm always excited to see Rubyists promoting things being explicit in code. That's my primary gripe with Ruby projects, too much magic fairy dust and freebies that generates complexity. I'll keep this tip in mind when I play around w/ Rail/Grape next time.

anti-pattern|13 years ago

I think a lot of this unfortunately comes from Rails. Rails hides a lot of complexity which creates "magic". And since most Rubyists come to Ruby from Rails, a lot of Rubyists have the bad habit of hiding complexity wherever possible. I was guilty of that myself. But I've noticed it slowly starting to change.

mnarayan01|13 years ago

I'm not sure that there's really any way to give a firm recommendation either way here. You can, after all, simply add

  :require => false
to any gems which you don't want to require with Bundler.require.

> Manually requiring dependencies at the top of every file very explicitly tells you and anyone else exactly what dependencies that file has.

While I don't disagree with this statement, I don't really know of any way to enforce it (certainly using Bundler.setup won't do so). You're always going to have everything that has been required elsewhere "pre-required" for you. I'll often start out explicitly requiring everything that a file needs when I start a project, and then end stopping when I look back at some file and notice that it lacks require statements for half the stuff it needs.

anti-pattern|13 years ago

Yes, but, if you test your classes in isolation, then you'll be forced to manually require each dependency at the top of the file.

Perceptes|13 years ago

Another thing to consider is thread safety. "require" is not thread safe, so if your app is multi-threaded, it's actually a good idea to load everything up front. Granted, you can still do this with manual requires, but Bundler.require does that job for you pretty nicely.

anti-pattern|13 years ago

Ah, that isn't something I considered. I don't write my apps multi-threaded, so it shouldn't be an issue, but definitely good to be aware of.

avand|13 years ago

If you subscribe to the philosophy that every line of code is a liability, which I do, this really hits home.