Rubygem 可执行文件 $LOAD_PATH 问题



我正在用 Ruby 编写一个 IDE,当我在命令行上运行程序时,以及当它作为 Rubygem 安装时,我想知道如何让我的所有文件都成为"必需的"。

我的Rubygem中有一个名为"vr"的可执行文件。 我需要使这个"vr"可执行文件"需要"我项目中的所有其他文件。

当我开发时,很容易需要我的所有项目文件。 我只是像这样"需要"它们的相对路径:

require_all Dir.glob(File.expand_path(File.dirname(__FILE__)) + "/../bin/**/*.rb")

require_all宝石将完美运作。 但是,当我将此程序安装为红宝石时,我遇到了一个大问题。 当我的"vr"可执行文件由rubygems安装时,它会将"vr"可执行文件复制到一个特殊的目录:

/home/eric/.rvm/gems/ruby-1.9.3-p125/bin

此目录与我的项目的根文件夹完全分开。 因此,"require"语句不再找到我所有项目的文件。

Rubygems 为我的 gem 根目录制作了这个目录:

/home/eric/.rvm/gems/ruby-1.9.3-p125/visualruby-0.0.55

我需要能够将该目录中的所有文件"要求"到我的项目中。

到目前为止,我的解决方案是制作第二个名为"visualruby.rb"的文件,该文件驻留在我的项目的 lib 文件夹中。 它包含 require_all 语句以要求所有项目文件。 然后,我只需要通过将以下代码添加到我的"vr"可执行文件中来将可执行文件链接到它:

base_file = File.dirname(__FILE__) + '/lib/visualruby.rb'
if File.file?(base_file) 
  require base_file  #load from project
else
  require 'visualruby.rb'  #load from gem
end
有必要检查相对于当前文件是否有一个名为"visualruby.rb"

的文件,因为当我开发时,它总会找到已安装的 gem 版本的"visualruby.rb"所以当我对文件进行更改时,它不起作用。 我必须强制它从我的开发项目中加载版本才能进行更改。

此外,我的 IDE 从头开始创建项目,因此很高兴知道对此的一般解决方案。 我想为所有项目提供一个一致的项目文件系统,但我不确定这是否可行。 我有一个为所有项目制作一个名为"requires.rb"的文件的一般解决方案,但我认为它不起作用,因为每个项目都会将相同的文件名添加到 $LOAD_PATH 中。

请帮助我了解如何在可以开发的地方制作一致的文件结构,并制作红宝石。

我找到了自己问题的答案:

问题是我正在使用红宝石 API 安装我的红宝石:

Gem::Installer.new(file_name)

这创建了系统链接,弄乱了我的路径。 有一个选项可以制作包装器而不是系统链接,这似乎是标准的安装方式:

Gem::Installer.new(file_name, :wrappers => true)

现在,包装器被复制到我的 gem 的 bin 目录中,它使用正确的路径。 现在我可以有一个可以制作成宝石的通用文件。 在开发和宝石中,一切都运行相同。

一个幸福的结局...

最新更新