使用自定义宝石在Dreamhost / Passenger上部署Sinatra应用程序

时间:2009-12-02 00:38:03

标签: ruby sinatra gem dreamhost pony

我有一个Sinatra应用程序,我试图在Dreamhost上运行,它利用小马发送电子邮件。为了在一开始就启动并运行应用程序(在添加小马之前),我必须将gem unpack rackgem unpack sinatra放入vendor /目录中,所以这是我的config.ru:

require 'vendor/rack/lib/rack'
require 'vendor/sinatra/lib/sinatra'

set :run, false
set :environment, :production
set :views, "views"

require 'public/myapp.rb'
run Sinatra::Application

我已经完成gem install ponygem unpack pony(进入vendor /)。之后,我尝试将require 'vendor/sinatra/lib/pony'添加到config.ru,只是让Passenger抱怨小马的依赖(mime-types,tmail)也没找到!

更好的方式来使用其他宝石,并调低那些冗长,丑陋,多余的requires。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

我建议您“在某处”创建自己的宝石路径,然后在config.ru中添加它 像:

ENV['GEM_PATH'] = xxx
Gem.clear_paths

然后将宝石安装到

答案 1 :(得分:3)

在dreamhost上安装Ruby gems

http://c.kat.pe/post/installing-ruby-gems-on-dreamhost/

更改config.ru(适用于Sinatra 1.0)

要求'rubygems'

要求'vendor / sinatra / lib / sinatra.rb'

ENV['GEM_HOME'] = '/home/username/.gems'
ENV['GEM_PATH'] = '$GEM_HOME:/usr/lib/ruby/gems/1.8'
require 'rubygems'
Gem.clear_paths

disable :run, :reload

set :environment, :production

require 'yourapp'
run Sinatra::Application

希望它有所帮助。

我正在为我的Sinatra使用小马和许多其他宝石。它也适合你。只需要在配置中添加这两行(GEM_HOME和GEM_PATH)。

答案 2 :(得分:1)

我花了很长时间才发现你可以简单地使用“gem install sinatra”并且gem会弄明白(因为系统目录是只读的)你将需要使用本地gem安装目录。截至目前,似乎根本没有必要设置任何特殊环境。它计算出使用$ HOME / .gem作为本地宝石路径,一切正常。根本不需要'供应商/东西'。我确实发现我必须在我的路径中添加$ HOME / .gem / ruby​​ / 1.8 / bin才能执行gems安装的二进制文件。

这是我的config.ru(适用于Dreamhost)

## Passenger should set RACK_ENV for Sinatra
require 'test'
set :environment, :development
run Sinatra::Application

稍后编辑:这一切都很好,但问题仍然是Passenger can't find my gems when the job initially starts up

答案 3 :(得分:0)

我的config.ru很简单:

require 'rubygems'
require 'vendor/sinatra/lib/sinatra.rb'
require 'app.rb'

和app.rb负责人:

require 'yaml'
require 'haml'
require 'ostruct'
require 'date'
require 'pp'

module FlytoFB
    log = File.new("sinatra.log", "a")
    STDOUT.reopen(log)
    STDERR.reopen(log)

    configure do

            enable :logging, :dump_errors
            set :app_file, __FILE__
            set :reload, true
            set :root, File.dirname(__FILE__)
            set :environment, :production
            set :env, :production
            set :run, false

            set :raise_errors, true
      set :public, 'public'

            error do
                    e = request.env['sinatra.error']
                    puts e.to_s
                    puts e.backtrace.join("\n")
                    "Application Error!"
            end

            not_found do
              "Page not found!"
      end