如何将Sinatra应用程序作为gem发布并部署它?

ber*_*kes 5 deployment gem rack sinatra

我有一个sinatra应用程序并将其打包为宝石.它的文件布局看起来大致如下:

??? bin
?   ??? tubemp
??? lib
?  ??? tubemp.rb
??? Gemfile
??? tubemp.gemspec
Run Code Online (Sandbox Code Playgroud)

我可以安装并运行它就好了.呼叫ruby lib/tubemp.rb也会触发应用程序,因为Sinatra让它自行启动.tubemp.rb:

class Tubemp < Sinatra::Application
  get '/' do
    erb :index, :locals => { :title => "YouTube embeds without third party trackers." }
  end
end
Run Code Online (Sandbox Code Playgroud)

二进制文件也很简单.bin/tubemp:

#!/usr/bin/env ruby
require "tubemp.rb"
Tubemp.run!
Run Code Online (Sandbox Code Playgroud)

但现在我想将其部署为Rack-app.或者将其部署在Rack-app中.至少它应该在生产机器上的Passenger下运行.

使用通用应用程序,就像config.ru在应用程序所在的目录中添加a一样简单.然后,该文件粗略地包括和调用run Tubemp.将nginx或apache的乘客指向此机架文件和应用程序所在的目录,启动它.这很有效,直到我把它变成了宝石; 因为现在我不再拥有"应用程序所在的目录",gem install tubemp除此之外决定放置文件.

我是否需要创建一个wrapper捆绑了tubemp-gem及其依赖项的应用程序?如果是这样,我如何从rackup文件中调用gem ?还是我完全错了?

ber*_*kes 2

现在忽略路径问题,这是我解决它的方法:

该应用程序捆绑为 gem tubemp,.

AGemfile安装并包含 gemified 应用程序:

gem 'tubemp'
Run Code Online (Sandbox Code Playgroud)

Aconfig.ru运行 gemized 应用程序,称为Tubemp

require 'rubygems'
require 'bundler/setup' # To allow inclusion via the Bundle/Gemfile
require 'sinatra'       # Sinatra is required so we can call its "set"
require 'tubemp'        # And include the application

# Set the environment to :production on production
set :environment, ENV['RACK_ENV'].to_sym

# And fire the application.
run Tubemp
Run Code Online (Sandbox Code Playgroud)

这两个文件是制作新的机架应用程序所需的全部文件,其中包括宝石化的 Sinatra 应用程序,因此可以通过 nginx、passenger 或简单的rackup.