1

我正在用 Ruby 编写一个 IDE,当我在命令行上运行该程序以及将其安装为 Rubygem 时,我对如何让我的所有文件都获得“必需”感到困惑。

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

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

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

require_all gem 将完美运行。但是,当我将此程序安装为 ruby​​gem 时,我遇到了一个大问题。当我的“vr”可执行文件由 ruby​​gems 安装时,它会将“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。

请帮助我了解如何在我可以开发和制作 ruby​​gems 的地方制作一致的文件结构。

4

1 回答 1

0

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

问题是我正在使用 ruby​​gems API 安装我的 ruby​​gems:

Gem::Installer.new(file_name)

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

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

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

一个圆满的结局...

于 2012-04-10T06:55:16.647 回答