【问题标题】:How to I load a gem from source?如何从源代码加载 gem?
【发布时间】:2012-09-02 07:07:39
【问题描述】:

我已经 git 从 Github 克隆了一个 repo,现在我想尝试一下,因为我想查看代码并弄乱它。我创建了一个应该加载这个 gem 的文件 test.rb,但是我想加载我本地签出的版本,这样做的正确方法是什么?

我现在只是用一堆"require_relative 'the_gem_name/lib/file'",感觉不对。

【问题讨论】:

  • 如果您在 gem 目录中创建了 test.rb,请使用 require 'gemname'
  • 如果可能的话,我想在 gem 目录之外创建 test.rb。不,我没有 gemfile。

标签: ruby rubygems gem


【解决方案1】:

按照 apneadiving 在 cmets 中的建议,我创建了一个 Gemfile 并添加了这一行

source "http://rubygems.org"

gem 'gem_name', path: '~/path/to/gem/source/folder'

然后bundle installbundle exec ruby test.rb 成功了。

【讨论】:

    【解决方案2】:

    当您require 'foo' 时,Ruby 检查加载路径中的所有目录以查找文件foo.rb 并加载它找到的第一个文件。如果找不到名为 foo.rb 的文件,并且您没有使用 Rubygems,则会引发 LoadError

    如果您正在使用 Rubygems(这可能是因为它包含在 Ruby 1.9+ 中),那么不要立即提出LoadError,而是搜索所有已安装的 Gems 以查看其中是否包含一个文件foo.rb。如果找到这样的 Gem,则将其添加到加载路径并加载文件。

    如果您想确保使用特定版本的库,您可以自己操作加载路径。通常不建议这样做,但这是您想要这样做的情况。

    有两种方法可以将目录添加到加载路径。首先,您可以在实际代码中使用$LOAD_PATH(或$:)全局变量:

    $LOAD_PATH.unshift '/path/to/the/gems/lib/'
    require 'the_gem'
    

    请注意,您通常要添加 gem 的 lib 目录,而不是 gem 的顶级目录(实际上这可能会根据实际的 Gem 有所不同,并且可能需要添加多个目录,但lib 是常态)。

    另一种方法是使用-I 命令行切换到ruby 可执行文件:

    $ ruby -I/path/to/the/gems/lib/ test.rb
    

    这种方式可能会更干净一些,因为通常您不想从代码内部弄乱加载路径,但如果您只是测试库,它可能并不重要。

    【讨论】:

    • 请注意,您可以检查 gemspec 以确保 lib 是唯一指定的 require path。这就是 gem 在需要文件时告诉 Rubygems 去哪里寻找文件的方式。
    • +1 当构建一个 gem 并从另一个项目中串联使用它时,这是一个很好的解决方案,就像我一样。
    • -I 是最好的部分。我只是使用--gempry 来快速测试我的更改!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多