I’ve never had any problem with the basic gem tree structure, namely
- bin (executables)
- lib (source code)
- test
…because I’ve always developed gems as libraries. However, I recently started to develop an application that ships as a gem.
This application has a “runner.rb” file (lib/mygem/runner.rb), that provides a method to run the application. The application is run from the bin/mygem file.
Now this bothers me. “runner.rb” is a file that is specific to our application, it is not a service or an API or any kind of support class for other to reuse (which is what library should be for, right?), yet its directory is “lib/mygem/runner.rb).
I’ve been reading a lot of definitions, and libraries are supposed to be support an application, not to be the application itself. We don’t say “this is the library of my application”, but “this is the source code of my application”.
So my question is, why do we put the libraries AND source code in the same folder?
I hope I made my point clear, I’m sure there’s a good reason behind this, and I’d be interested to hear your thought and to clear this out.
Thank you for reading this 🙂
After even further investigations, it turns out ‘lib/’ is called ‘lib/’ because it only contains definitions.
‘bin’ is a script that gets executed, like a ‘main’ function. Since it gets executed, no application logic should be in it, otherwise it’s not easily testable.
Thus, all the application logic belongs to your application’s library folder. The bin (main) file’s only task is to instantiate your application’s runner class and run it.