【问题标题】:How to use a gem in Sinatra?如何在 Sinatra 中使用宝石?
【发布时间】:2011-06-23 04:27:21
【问题描述】:

我正在构建一个名为 Lovers 的 Facebook 应用的新版本。您可以找到Lovers source code on GitHub。我还在为 Facebook 构建一个自定义 gem。我希望我对这个自定义 Facebook gem 所做的更改立即对 Lovers 生效。

组织其目录结构的正确方法是什么?目前,它看起来像这样:

|- config.ru
|- features
  |- support
    |- env.rb
|- lib
  |- lovers
  |= lovers.rb
|- vendor
  | - facebook
    | - lib
       |- modules/classes here

我从config.ruenv.rb./vendor/facebook/lib 添加到$LOAD_PATH。这行得通,但我应该使用init.rb 文件来执行此操作吗?最佳做法是什么?

【问题讨论】:

    标签: ruby facebook sinatra gem


    【解决方案1】:

    我不会创建vendor 文件夹,而是使用Bundler

    创建Gemfile 并定义所有要求。 然后在你的loves.rb文件中放置以下代码

    require "rubygems"
    require "bundler/setup"
    
    Bundler.require(:default, (ENV["RACK_ENV"] || :development).to_sym)
    

    我通常在根文件夹中创建一个boot.rb 文件,然后将代码移到那里,将lib 添加到加载路径。

    # boot.rb
    $:.unshift(File.dirname(__FILE__) + "/lib")
    
    require "rubygems"
    require "bundler/setup"
    
    Bundler.require(:default, (ENV["RACK_ENV"] || :development).to_sym)
    
    
    # lib/lovers.rb
    
    require "boot"
    ...
    

    【讨论】:

    • 为什么?这不会让对 Facebook gem 进行更改并立即看到这些更改将如何影响 Lovers 变得更加困难吗?因为那样我必须先捆绑 Facebook gem,对吗?使用vendor 目录,更改会立即生效。
    • 自己更改第三方库不是一个好主意。这种方法将使升级成为一场真正的噩梦。
    • 它不是第三方库。 Facebook gem 是我与 Lovers 一起构建的 gem,类似于 ActiveRecord 与 Rails 一起构建的方式。请重新阅读我的问题。
    【解决方案2】:

    您可以将您的 gem 放入 vendor/facebook,并按照 Simone Carletti 的建议使用 Bundler,但是您可以使用 :path 选项告诉 bundler 在哪里而不是从 ruby​​gems 中提取 your gem加载你的宝石。

    使用它,您甚至可以将 gem 从项目树中移出,同时并排开发它们。

    您的Gemfile 将包含以下内容:

    gem 'facebook', :path => '../facebook'
    

    这还有其他几个问题。

    1. 为了让您使用 Bundler 来管理您的 gem,您的 gem 需要一个 .gemspec 文件。 gemspec 指定您的 gem 的信息,例如版本和依赖项。查看docs on it

    2. 已经有一个名为 facebook 的 gem,因此您可能需要为您的 gem 考虑一个不同的名称。

    【讨论】:

    • 这听起来很棒。谢谢!我会试试这个。
    【解决方案3】:

    我认为行为驱动开发 (BDD) 方法是在单独的源代码树中构建您的 Facebook gem,并使用 RSpec 或其他一些测试工具对其进行测试。

    一旦 Gem 达到功能上有用的迭代,然后按照建议使用 Bundler 将其包含在您的应用程序中。

    【讨论】:

    • 为什么是“Ruby 方式”,即,为什么这种方式最好?似乎对 Facebook gem 进行更新会很痛苦。功能永远不会完整。它总是在变化。
    • 我真的在描述开发 Gem 的行为驱动开发方式(我更新了我的答案)。我不得不承认,我才刚刚开始使用这种方法。它确实考虑了长期的迭代开发方法。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多