Rubygem可执行文件$ LOAD_PATH问题

时间:2012-04-09 22:40:19

标签: ruby rubygems load-path

我正在用Ruby编写一个IDE,当我在命令行上运行程序时,以及当它作为Rubygem安装时,我很难理解如何让我的所有文件“必需”。

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

当我开发时,很容易需要我所有项目的文件。我只是简单地“要求”它们的相对路径:

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

require_all gem将完美运行。但是,当我将这个程序安装为rubygem时,我遇到了一个大问题。当我的“vr”可执行文件由rubygems安装时,它将“vr”可执行文件复制到一个特殊目录:

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

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

Rubygems为我的gem的root创建了这个目录:

/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。

请帮助我理解如何在我开发和制作rubygems的地方建立一致的文件结构。

1 个答案:

答案 0 :(得分:0)

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

问题是我使用rubygems API安装我的rubygems:

Gem::Installer.new(file_name)

这创建了搞乱我路径的syslinks。有一个选项来创建包装器而不是syslinks,这似乎是安装的标准方法:

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

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

结局很快......

相关问题