我正在用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的地方建立一致的文件结构。
答案 0 :(得分:0)
我找到了自己问题的答案:
问题是我使用rubygems API安装我的rubygems:
Gem::Installer.new(file_name)
这创建了搞乱我路径的syslinks。有一个选项来创建包装器而不是syslinks,这似乎是安装的标准方法:
Gem::Installer.new(file_name, :wrappers => true)
现在将包装器复制到我的gem的bin目录中,它使用正确的路径。现在我可以拥有一个可以制作成宝石的通用文件。在开发和宝石中,一切都运行相同。
结局很快......