如何在 Ruby 中引用本地 gem?

8

我将一些Ruby代码打包成了一个gem。我想在其他代码中引用这个gem中的代码。 因此,在Gemfile中,我需要指定gem的名称、版本和本地路径,例如:

gem 'gemname','0.x', :path => 'RELATIVE_PATH_TO_GEM_FILE'

在运行 bundle install 后,我看到了:
Using gemname (0.x) from source at RELATIVE_PATH_TO_GEM_FILE

但是当我运行代码时,它找不到gem中的代码。LOAD_PATH显示ABSOLUTE_PATH_TO_GEM_FILE/lib。
难怪它找不到代码,因为在ABSOLUTE_PATH_TO_GEM_FILE下只有gem文件,没有解压的lib目录。
如果我将该gem文件安装到系统中,则一切正常。我可以看到gem文件被解压缩为源代码文件。
但我的问题是是否可以以某种方式直接引用本地的gem文件?

通常,“本地 gem” 这个术语意味着你已经在本地编译和安装了它,而不是从其他网站下载。你考虑过编译和安装本地 gem 吗?这样做可能更好。 - Andrew Grimm
实际上,.gem 文件是我自己创建的。我只是将一些 Ruby 代码打包到那个 .gem 文件中,试图让它们容易与其他代码共享。在 .gem 文件中有 lib 目录。我原以为它会像 Java 中的 jar 文件一样。我想 Ruby 可以查看包文件,而不必将它们全部解压缩。令人困惑的是,bundler 实际上在包中找到了源代码。但是 load_path 似乎不支持包中的目录。 - user810923
顺便说一下,虽然Bundler已经在我的特定路径下找到了.gem文件,但是除非该.gem文件已安装到系统gemset中,否则它不会将.gem缓存到vendor/cache中。 - user810923
2个回答

9

不可以直接引用 .gem 文件。

在你的术语中,你需要使用一个“未打包”的 gem。

:path => '/foo/bar/'

其中 /foo/bar/ 是一个包含 lib/ 等文件的 (gem) 目录。


2
我们创建了一个本地(非系统级)的宝石库。我们设置了以下环境变量:
GEM_HOME=/path/to/rubygems-1.3.4
RUBYLIB=/path/to/rubygems-1.3.4/lib/

通过设置这些内容,我们可以使用“gem install ...”将构建的gem放入该目录中,然后ruby就知道在哪里找到它们了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接