我用二进制构建了一个ruby gem。我这样用:
myruby "param"
它是构建集成的助手,需要为每个项目设置一个设置。我在settings.rb
中为多个项目设置了设置。是否可以根据当前工作目录要求.rb
文件?我跑的时候:
/home/usr/admin/sources/myproject1/ $ myruby start
我希望它需要以下设置:
/home/usr/admin/sources/myproject1/settings.rb
如果有可能,我怎么能这样做?我试过了:
require_relative '#{Dir.pwd}/settings.rb'
哪个不起作用。
答案 0 :(得分:3)
File.expand_path('../', __FILE__)
为您提供当前目录的路径。因此,如果您在bin/foo
中有一个文件,并且想要lib/foo/settings.rb
中的内容,只需使用
require File.join(File.expand_path('../../'), __FILE__), 'lib/foo/settings.rb')
请注意双../
因为第一个需要从__FILE__
中删除当前文件名。
如果文件位于/home/usr/admin/sources/myproject1/bin/foo
File.expand_path('../', __FILE__)
# => /home/usr/admin/sources/myproject1/bin
File.expand_path('../../', __FILE__)
# => /home/usr/admin/sources/myproject1
File.join(File.expand_path('../../', __FILE__), 'lib/foo/settings.rb')
# => /home/usr/admin/sources/myproject1/lib/foo/settings.rb
如果要使用工作目录中的相对路径包含文件,请使用
require File.join(Dir.pwd, 'settings.rb')
但是,我认为以这种方式对路径进行硬编码并不是一个好主意。您可能希望将设置作为参数传递给命令行。
创建一个依赖于机器上硬编码文件路径的gem是没有意义的。
答案 1 :(得分:0)
File.expand_path(File.dirname(__FILE__))
将返回相对于调用此命令的文件的目录
require
和require_relative
之间的区别在于require_relative
从目录加载文件相对于写入文件的文件。如果给定相对路径,require
搜索$LOAD_PATH
目录中的文件,或者可以从绝对路径加载文件,可以使用File.expand_path