5

假设您有一个可执行文件 foo.rb,其中的库 bar.rb 以下列方式布局:

<root>/bin/foo.rb
<root>/lib/bar.rb

在 foo.rb 的标题中,您需要在 bar.rb 中引入以下功能:

require File.dirname(__FILE__)+"../lib/bar.rb"

只要对 foo.rb 的所有调用都是直接的,这就可以正常工作。如果您输入 $HOME/project 并将符号链接 foo.rb 放入$HOME/usr/bin,则__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rbfoo.rb.

我意识到像 ruby​​gems 这样的打包系统通过创建一个名称空间来搜索库来解决这个问题,并且也可以使用$:include来调整 load_path $HOME/project/lib,但似乎应该存在一个更简单的解决方案。有没有人遇到过这个问题并找到有用的解决方案或配方?

4

3 回答 3

12

我知道这已经很久了,但我刚刚发现了这个:

require 'pathname'
APP_ROOT = File.join(File.dirname(Pathname.new(__FILE__).realpath),'..')
于 2009-04-20T20:07:44.307 回答
2

您可以使用此函数跟踪任何符号链接并返回真实文件的完整路径:

def follow_link(file)
  file = File.expand_path(file)

  while File.symlink?(file)
    file = File.expand_path(File.readlink(file), File.dirname(file))
  end

  file
end

puts follow_link(__FILE__)
于 2008-11-27T10:50:38.490 回答
1

可能值得一提的是,它+可以很好地与Pathname对象一起工作,而且还有Kernel.Pathname方法,所以@Burke 的原始代码可以变得更短:

require 'pathname'
APP_ROOT = Pathname.new(__FILE__).realpath + "../../lib"
于 2010-04-20T09:37:54.097 回答