Libraries and requiring other files

Hi!

I’ve written a library (for the sake of this email, let’s call it
Mylib). The directory structure for it is like this:

lib/
|- mylib/
| |- bar.rb
| - foo.rb
|
- mylib.rb

Now, in the applications, I do “require ‘lib/mylib.rb’” or similar. Then
mylib.rb does “require ‘mylib/foo.rb’” and “require ‘mylib/bar.rb’”.
This works fine when I use the FILE-idiom (to check if you run
mylib.rb directly), but from another file, this fails. (Because it looks
for mylib/foo.rb relative to the cwd of the application requiring
mylib.rb, which is wrong)

What’s the best approach to solve this?

I could either change $LOAD_PATH in the library, adding
File.dirname(FILE) to it, or using File.dirname(FILE) as a part
of every includepath. (require File.dirname(FILE) + ‘…’)

Other suggestions also welcome. :slight_smile:

“Jørgen P. Tjernø” wrote:

Hi!

I’ve written a library (for the sake of this email, let’s call it
Mylib). The directory structure for it is like this:

lib/
|- mylib/
| |- bar.rb
| - foo.rb
|
- mylib.rb

Now, in the applications, I do “require ‘lib/mylib.rb’” or similar. Then
mylib.rb does “require ‘mylib/foo.rb’” and “require ‘mylib/bar.rb’”.
This works fine when I use the FILE-idiom (to check if you run
mylib.rb directly), but from another file, this fails. (Because it looks
for mylib/foo.rb relative to the cwd of the application requiring
mylib.rb, which is wrong)

What’s the best approach to solve this?

I could either change $LOAD_PATH in the library, adding
File.dirname(FILE) to it, or using File.dirname(FILE) as a part
of every includepath. (require File.dirname(FILE) + ‘…’)

Other suggestions also welcome. :slight_smile:

I use the same directory structure in my projects. During testing, I
just add a -Ilib option to the ruby command. That allows me to “require
‘mylib’” from client code, and mylib will just do “require ‘mylib/bar’”.
It avoids all the FILE hackery.

Of course, if you don’t want to type -Ilib all the time, use Rake to
setup your unit tests. The default test task in Rake will handle this
fine.

When you deploy your application, just deploy to to a directory that is
included in the standard ruby search path. Generally this is somewhere
in the sitedir directory.

– Jim W.

I also use the -I' option when I need to test scripts. As Jim said, when you deploy your application, make it install into a directory that Ruby will automatically search. A good way to deploy applications is to usesetup.rb’ (just Google for it) or build a gem.