【问题标题】:How to use a gem in Rails 3 without referencing it in the Gemfile如何在 Rails 3 中使用 gem 而不在 Gemfile 中引用它
【发布时间】:2010-09-20 15:24:12
【问题描述】:

我想知道如何在 Rails 3 应用程序中访问 gem,而不在 gemfile 中添加对它的引用。我想用 ruby​​-debug 来做这个(我正在使用ruby-debug19)。我用它来调试,但不是我团队中的每个人都这样做,并且强制依赖以便我可以使用它似乎不是很外交。还有其他方法吗?

如果它最终很重要,我正在使用 Rails3、Bundler 1.0.0、Ruby 1.9.2、RVM、OSX Snow Leopard

顺便说一句,我曾考虑过使用 gemfile 组功能,但感觉也不对。组对于诸如 factory_girl 之类的东西来说似乎很棒,尽管它只在特定环境中存在实际依赖关系,但使用 ruby​​-debug 除非你想使用它,否则不需要它存在。

【问题讨论】:

  • 我决心自己解决这个问题,如果我这样做了,我会分享。 IMO Bundler 是 Rails 发生过的最糟糕的事情。

标签: ruby-on-rails rubygems ruby-on-rails-3 gem bundler


【解决方案1】:

这真的很丑,它不会将它从你的 gemfile 中提取出来,但是我在我的 Gemfile 中这样做了,所以我可以在不同的环境中为 gem 使用 2 个不同的来源:

if ENV['MY_RDEBUG_VAR'] == "i_want_to_use_rdebug"
  gem "ruby-debug"
end

只需将其设置为只有您才能在系统上设置的晦涩环境变量。这样一来,您的同事将不会设置 env var,并且永远不会为他们安装或加载 gem。

【讨论】:

    【解决方案2】:

    AFAIK 你不能,因为 Rails 3 隔离了系统 Gems。

    我的建议是使用 :require => false 选项在 Gemfile 中添加 Gem,以便包含、安装但从未加载。 然后,在您的应用中,手动要求 gem。

    或者您可以尝试将其捆绑到您的项目中,在供应商文件夹中(应该有一个 Gems 文件夹)并忽略 SCM 中的特定 gem 文件夹,这样您的同事就不会受到影响。

    【讨论】:

    • 感谢您的建议。不过,我真的很讨厌甚至需要安装 gem。这个特定 gem 的安装并不总是直截了当的,bundle install 命令会因此而失败:(.
    【解决方案3】:

    我最终将以下代码添加到 Rails 初始化程序并在 .git/info/exclude 文件中忽略它。

    $: << Bundler.bundle_path.join("gems", "ruby-debug19-0.11.6", "cli")
    $: << Bundler.bundle_path.join("gems", "ruby-debug-base19-0.11.24", "lib")
    $: << Bundler.bundle_path.join("gems", "linecache19-0.5.11", "lib")
    $: << Bundler.bundle_path.join("gems", "columnize-0.3.1", "lib")
    require 'ruby-debug'
    

    虽然这可行,但我不知道是否有人真的应该这样做,接受这些依赖项需要放在 gem 文件中的事实可能是最好的。

    【讨论】:

    • 使用此解决方案需要您自担风险。我相信它在 RVM 的后续版本中已停止为我工作。现在,我将 ruby​​-debug 添加到我的 gemfile 中的开发组中。
    【解决方案4】:

    这是我自己在 ruby​​ 1.8 和 1.9 中使用 ruby​​_debug 的解决方案

    if RUBY_VERSION.include?('1.9')
      ruby_debug = 'ruby-debug19'  # new branch for ruby-debug that supports 1.9
    else
      ruby_debug = 'ruby-debug'
      gem 'fastercsv' # ruby 1.9 bundles FasterCSV now
    end
    
    
    group :test do
      gem 'webrat'
      gem "factory_girl"
      gem 'shoulda'
    
      # gem 'redgreen'
      gem 'autotest-rails'
      gem 'autotest-fsevent'
      gem 'autotest'  
      gem ruby_debug
    end
    
    group :development do
      gem ruby_debug
    end
    

    【讨论】:

      【解决方案5】:

      我知道这并没有涵盖其他一些情况在我的.irbrc 中获得更好的体验,我不想强​​加给每个人,比如 wirble 和 hirb——但特别是对于ruby-debug,如果针对多个 Ruby 版本进行测试是你痛苦的一部分,ruby-debug-wrapper gem 会很有帮助.

      如果您想避免安装任何版本的ruby-debug,我认为其他人建议的选项是目前唯一的方法。

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 2012-08-27
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多