我正在用 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 目录中,它使用正确的路径。 现在我可以有一个可以制作成宝石的通用文件。 在开发和宝石中,一切都运行相同。
一个幸福的结局...