==============================
puts "this configuration file is located in this directory: " +
File.dirname( ??? )
eval File.read(File.dirname( ??? ) + "/common.rb")
# other stuff
common.rb is located in /joe/configuration. It also contains some Ruby code.
And I'd start the program via 'ruby main.rb /joe/configuration.rb'.
So, I have a main program that reads in a Ruby configuration file that
can also read other configuration files that are in a relative
directory. I'm having problems with the relative directory part. If
I hardcode the directory paths, everything's ok. But I don't want
/joe/configuration/config.rb to know that it's in /joe/configuration.
I just want that configuration file to be able to read
/joe/configuration/common.rb.
Sorry if this is confusing, let me know if I can clarify the question.
Don't worry Joe, this is a common problem, and fairly easily solved.
All you have to do is use Ruby's built-in library search path code,
with a special addition:
config.rb:
# Adds the directory containing this code to the search path
$:.unshift File.dirname(File.expand_path(__FILE__))
# Now require will work
require 'common'
Ryan
···
On 10/21/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
So, I have a main program that reads in a Ruby configuration file that
can also read other configuration files that are in a relative
directory. I'm having problems with the relative directory part. If
I hardcode the directory paths, everything's ok. But I don't want
/joe/configuration/config.rb to know that it's in /joe/configuration.
I just want that configuration file to be able to read
/joe/configuration/common.rb.
Sorry if this is confusing, let me know if I can clarify the question.
And I'd start the program via 'ruby main.rb /joe/configuration.rb'.
So, I have a main program that reads in a Ruby configuration file that
can also read other configuration files that are in a relative
directory. I'm having problems with the relative directory part. If
I hardcode the directory paths, everything's ok. But I don't want
/joe/configuration/config.rb to know that it's in /joe/configuration.
I just want that configuration file to be able to read
/joe/configuration/common.rb.
Sorry if this is confusing, let me know if I can clarify the question.
Joe
What about something like
def with_load_path(path)
$LOAD_PATH.unshift path
yield
ensure
$LOAD_PATH.shift
end
Then use that around your #eval call in the main program, with the
'/joe/configuration' as the argument. Then require should work relative
to the path you gave. (But note that $LOADED_FEATURES will prevent files
with the same name from being loaded again, even if in a different
config dir.)
Not thread safe, but oh well.
Another option: my "script" lib (see RAA). That makes sure that the
global $LOADED_FEATURES doesn't get affected.
···
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
And I'd start the program via 'ruby main.rb /joe/configuration.rb'.
So, I have a main program that reads in a Ruby configuration file that
can also read other configuration files that are in a relative
directory. I'm having problems with the relative directory part. If
I hardcode the directory paths, everything's ok. But I don't want
/joe/configuration/config.rb to know that it's in /joe/configuration.
I just want that configuration file to be able to read
/joe/configuration/common.rb.
If those other files do only belong to your config.rb (and are no files that you wish to require) then you can do this in config.rb
base = File.basename __FILE__
load File.join(base, "common.rb")
File.open(File.join(base, "common.rb") do |io|
....
end
File.open(File.join(base, "etc", "lib", "whatever.conf") do |io|
....
end