Есть ли способ, по которому Rails 3.0.x может по умолчанию использовать Thin? - PullRequest
13 голосов
/ 31 января 2011

Я запускаю веб-сервер Thin практически для каждого приложения в моей среде разработки / тестирования.Когда я использовал Mongrel с Rails 2.x, все, что мне нужно было набрать, было script/server, чтобы заставить его работать на выбранном веб-сервере.Но с Rails 3 я должен каждый раз указывать Thin.Есть ли способ запустить Thin в моих приложениях на Rails, просто набрав rails s вместо rails s thin?

Ответы [ 4 ]

21 голосов
/ 13 августа 2011

Да, это возможно.

Работа команды rails s в конце дня заключается в том, чтобы перейти к Rack и позволить ему выбрать сервер. По умолчанию обработчик Rack будет пытаться использовать mongrel, и если он не сможет найти дворнягу, он будет использовать webrick. Все, что нам нужно сделать, это слегка исправить обработчик. Нам нужно будет вставить наш патч в сам скрипт rails. Вот что вы делаете, взломайте ваш файл script/rails. По умолчанию это должно выглядеть так:

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'

Мы вставляем наш патч прямо перед строкой require 'rails/commands'. Наш новый файл должен выглядеть так:

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rack/handler'
Rack::Handler.class_eval do
  def self.default(options = {})
    # Guess.
    if ENV.include?("PHP_FCGI_CHILDREN")
      # We already speak FastCGI
      options.delete :File
      options.delete :Port

      Rack::Handler::FastCGI
    elsif ENV.include?("REQUEST_METHOD")
      Rack::Handler::CGI
    else
      begin
        Rack::Handler::Mongrel
      rescue LoadError
        begin
          Rack::Handler::Thin
        rescue LoadError
          Rack::Handler::WEBrick
        end
      end
    end
  end
end
require 'rails/commands'

Обратите внимание, что теперь он попробует Mongrel, и если возникнет ошибка, попробуйте Thin, и только потом переходите к Webrick. Теперь, когда вы набираете rails s, мы получаем поведение, которое нам нужно.

10 голосов
/ 02 марта 2012

Начиная с Rails 3.2rc2, thin теперь запускается по умолчанию при вызове rails server, когда gem 'thin' находится в вашем Gemfile! Благодаря этому запросу: https://github.com/rack/rack/commit/b487f02b13f42c5933aa42193ed4e1c0b90382d7

Прекрасно работает для меня.

1 голос
/ 13 февраля 2012

В script/rails работает также:

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)

require 'rack/handler'
Rack::Handler::WEBrick = Rack::Handler::Thin

require 'rails/commands'
0 голосов
/ 31 января 2011

Просто установите thin, cd в каталог, в котором находится ваше приложение, и запустите тонкий старт.Здесь прекрасно работает.:)

Вы можете использовать http://www.softiesonrails.com/2008/4/27/using-thin-instead-of-mongrel для изменения по мере необходимости.(Это тот, который я использовал)

...