从 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
假设我正在开发一个 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