如何在Sinatra中使用宝石?

时间:2011-02-08 03:06:00

标签: ruby facebook sinatra gem

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

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

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

我将./vendor/facebook/lib添加到了来自$LOAD_PATH& config.ru的{​​{1}} env.rb。这是有效的,但我应该使用init.rb文件来执行此操作吗?什么是最佳做法?

3 个答案:

答案 0 :(得分:2)

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

创建Gemfile并定义所有要求。 然后在您的lovers.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"
...

答案 1 :(得分:1)

你可以将你的宝石放在vendor/facebook中,并使用Bundler作为Simone Carletti的建议,但不是从rubygems中提取你的宝石,你可以使用:path选项,告诉bundler从哪里加载你的宝石。

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

您的Gemfile将包含以下内容:

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

还有其他一些问题。

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

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

答案 2 :(得分:1)

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

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