如何从Ruby/Rake获取调用者路径?

How to get the caller path from Ruby/Rake?

In Ruby/Rake(a gem for Ruby), 当前文件路径可以通过Dir.pwd__FILE__.

得到

有时候我想获取调用者的路径,比如找出调用者提供的相对于他们的路径的相对路径(但不是相对于 Rakefile 的路径)。

一个例子

在目录 /home/me/workspace/proj 的 Rakefile 中:

# ...

task :foo do
  file_name = ENV['WHICH_FILE']

  # As I can not get the caller dir, give it the Rakefile dir instead
  caller_dir = Dir.pwd

  file_name = "#{call_dir}/#{file_name}" unless file_name&.match? /^\//
  puts File.read file_name
  # ...
end

# ...

如果调用者提供目标文件的绝对路径,没问题:

$ WHICH_FILE=/home/me/workspace/proj/suba/subb/subc/file.txt rake foo

如果/home/me/workspace/proj中的调用者提供了相对路径,仍然没有问题:

$ WHICH_FILE=suba/subb/subc/file.txt rake foo

如果/home/me/workspace/proj/suba中的调用者提供了相对路径,file_name可能指向错误的地方:

$ WHICH_FILE=subb/subc/file.txt rake foo

现在 file_name 将是 /home/me/workspace/proj/subb/subc/file.txt,这可能不是来电者想要的。

问题

是否可以在Ruby/Rake中获取来电者的路径?如果可以,怎么做?

你可以告诉用户现在在哪里,就像你说的,Dir.pwd,但是没有办法猜测用户真正想要的绝对路径。

这就是为什么大多数脚本(或应用程序等)都有一个 ROOT_DIR 允许您默认将其作为目录结构其余部分的前缀,或者只是假设传递的文件位于当前文件夹(由 pwd 显示)。

您的选择是在您的代码中的某处设置此 ROOT_DIR,或者只是接受用户给您一个文件的相对路径而不真正知道该文件的绝对路径是什么的机会,只是假设在他们当前的目录下。