从 Ruby Gem 中,如何获取项目的目录路径?

From a Ruby Gem, how can I get the directory path to the project?

假设我正在开发一个 Ruby gem,它将通过添加到项目的 gem 文件中来安装。从我的gem,我想知道项目的根目录路径。我怎样才能得到它?

如果您使用 Rails,请使用 Rails.root

如果您不知道 'main project' 是 Rails... 不一定有好的方法。

Global [=11=] 是调用 ruby 脚本的命令名称。但这不一定包含路径。您可以尝试 File.expand_path [=12=],但有很多原因会导致它无法为您提供您想要的内容,包括程序可能已经更改为 "working directory"。 Dir.pwd 会给你 "current working directory",只有当项目是从 "project directory" 调用并且代码没有改变当前工作时,它可能是 "project" 的目录目录。

一般来说,在 ruby 中实际上没有 "project" 或 "project directory" 的内置概念——你可以有一个不是的 ruby 脚本实际上是一个项目的一部分,它只是一个文件,位于您想要的文件系统中的任何位置。

我认为没有普遍可靠的方法来做到这一点,这取决于 "the project" 的设置方式,当然 gem 无法确定。

但是如果您使用 Rails、Rails.root,因为 Rails 有关于如何设置和调用的约定,并在其中实现了 Rails.root 功能启动过程记录Rails'project directory'。

这个问题没有完美的解决方案,但您可以创建一个适用于大多数一般情况的基于回退的解决方案。如果定义了 Rails,我们使用 Rails.root。如果定义了 Bundler,我们使用 Bundler.root 但它仅在 Gemfile 定义在项目根目录时才有效(在大多数情况下都是如此)。否则退回到 Dir.pwd

def project_root
  if defined?(Rails)
    return Rails.root
  end

  if defined?(Bundler)
    return Bundler.root
  end

  Dir.pwd
end