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

我有一个Sinatra应用程序,我试图在Dreamhost上运行,利用小马发送电子邮件。 为了在一开始就启动并运行应用程序(在添加小马之前),我不得不将gem unpack sinatra 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 /)。 之后,我尝试向config.ru添加require 'vendor/sinatra/lib/pony' ,只是让Passenger抱怨小马的依赖 (mime-types,tmail)也没有找到!

必须有一种更好的方式来使用其他gem并降低那些冗长,丑陋,多余的requires 。 有什么想法吗?

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

 ENV['GEM_PATH'] = xxx Gem.clear_paths 

然后将你的gem安装到那里

在dreamhost上安装Ruby gem

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。 它也应该适合你。 只需要在配置中添加两行(GEM_HOME和GEM_PATH)。

我花了很长时间才发现你可以简单地使用“gem install sinatra”,而gem会弄清楚(因为系统目录是只读的),你需要使用本地gem安装目录。 截至目前,似乎根本没有必要设置任何特殊环境。 它计算出使用$ HOME / .gem作为本地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 

稍后编辑:这一切都很好,但仍然存在这样的问题: 当工作最初启动时 , 乘客无法找到我的gem 。

我的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