来自当前工作目录的require_relative

时间:2013-12-16 11:16:48

标签: ruby gem require

我用二进制构建了一个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'

哪个不起作用。

2 个答案:

答案 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__))将返回相对于调用此命令的文件的目录 requirerequire_relative之间的区别在于require_relative从目录加载文件相对于写入文件的文件。如果给定相对路径,require搜索$LOAD_PATH目录中的文件,或者可以从绝对路径加载文件,可以使用File.expand_path

创建