【问题标题】:require_relative from present working dir来自当前工作目录的 require_relative
【发布时间】:2014-01-03 18:21:42
【问题描述】:

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

这不起作用。

【问题讨论】:

  • 你用过bundler吗?

标签: ruby gem require


【解决方案1】:
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 是没有意义的。

【讨论】:

  • 不幸的是,这会返回“/Library/Ruby/Gems/2.0.0/gems/”,因为我使用的是 gem 中的程序。
【解决方案2】:

File.expand_path(File.dirname(__FILE__)) 将返回与调用此命令的文件相关的目录。
requirerequire_relative 之间的区别在于require_relative 从相对于写入文件的目录加载文件。而require$LOAD_PATH的目录中搜索文件,如果给定了相对路径或者可以从绝对路径加载文件,可以使用File.expand_path创建

【讨论】:

  • 执行的文件在 gems 目录中,因此我得到的回报是“/Library/Ruby/Gems/2.0.0/gems/”而不是“home/usr/admin/sources/myproject1 "
  • 如果我理解正确,您需要获取运行myruby 的目录。如果你使用的是 Unix,你可以从 PWD 环境变量中获取当前目录,在 ruby​​ 中使用 ENV['PWD']
猜你喜欢
  • 2020-06-05
  • 2016-03-22
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多