Ruby Rack - установка простого веб-сервера, который считывает index.html по умолчанию
Я пытаюсь получить некоторую информацию из этого урока: http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builder
В принципе, я хочу иметь файл config.ru
, который говорит стойке, чтобы прочитать текущий каталог, чтобы я мог получить доступ ко всем файлам, как к простому серверу apache, а также прочитать корень по умолчанию с помощью файла index.html... есть ли способ сделать это?
my current config.ru
выглядит так:
run Rack::Directory.new('')
#this would read the directory but it doesn't set the root to index.html
map '/' do
file = File.read('index.html')
run Proc.new {|env| [200, {'Content-Type' => 'text/html'}, file] }
end
#using this reads the index.html mapped as the root but ignores the other files in the directory
Так что я не знаю, как исходить отсюда...
Я также пробовал это в соответствии с примером учебников, но thin
не запускается должным образом.
builder = Rack::Builder.new do
run Rack::Directory.new('')
map '/' do
file = File.read('index.html')
run Proc.new {|env| [200, {'Content-Type' => 'text/html'}, file] }
end
end
Rack::Handler::Thin.run builder, :port => 3000
Заранее спасибо
Ответы
Ответ 1
Я думаю, что вам не хватает команды rackup. Вот как он используется:
rackup config.ru
Это будет запускать ваше приложение стойки на порту 9292 с помощью webrick. Вы можете прочитать "rackup --help" для получения дополнительной информации о том, как вы можете изменить эти значения по умолчанию.
О приложении, которое вы хотите создать. Вот как я думаю, это должно выглядеть так:
# This is the root of our app
@root = File.expand_path(File.dirname(__FILE__))
run Proc.new { |env|
# Extract the requested path from the request
path = Rack::Utils.unescape(env['PATH_INFO'])
index_file = @root + "#{path}/index.html"
if File.exists?(index_file)
# Return the index
[200, {'Content-Type' => 'text/html'}, File.read(index_file)]
# NOTE: using Ruby >= 1.9, third argument needs to respond to :each
# [200, {'Content-Type' => 'text/html'}, [File.read(index_file)]]
else
# Pass the request to the directory app
Rack::Directory.new(@root).call(env)
end
}
Ответ 2
Я оказался на этой странице, ища один лайнер...
Если вы хотите использовать текущий каталог для нескольких одноразовых задач, это все, что вам нужно:
ruby -run -e httpd . -p 5000
Подробная информация о том, как это работает: http://www.benjaminoakes.com/2013/09/13/ruby-simple-http-server-minimalist-rake/
Ответ 3
Вы можете сделать это, используя Rack:: Static
map "/foo" do
use Rack::Static,
:urls => [""], :root => File.expand_path('bar'), :index => 'index.html'
run lambda {|*|}
end
Ответ 4
Мой пример для того, чтобы сделать то же самое ниже:
module Rack
class DirectoryIndex
def initialize(app)
@app = app
end
def call(env)
index_path = ::File.join($documentRoot, Rack::Request.new(env).path.split('/'), 'index.html')
if ::File.exists?(index_path)
return [200, {"Content-Type" => "text/html"}, [::File.read(index_path)]]
else
@app.call(env)
end
end
end
end
require 'rack_directory_index.rb'
$documentRoot = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'build'))
Capybara.app = Rack::Builder.new do |builder|
puts "Creating static rack server serving #{$documentRoot}"
use Rack::DirectoryIndex
run Rack::Directory.new($documentRoot)
end
Capybara.configure do |config|
config.run_server = true
end
В основном это копия и вставка из разных ответов, но она отлично работает. Вы можете найти его как gist here aswell, удачи
Ответ 5
Для меня, используя Ruby 2.0 и Rack 1.5.2, решение sinm работало для обслуживания индексной страницы (как в качестве страницы по умолчанию для root, так и для загрузки явно), но для других файлов я получил ошибки, похожие на следующие:
Rack::Lint::LintError: Status must be >=100 seen as integer
Я объединил решение sinm с этим SO-ответом и фрагментом, найденным на Документация Heroku для получения желаемого поведения (при условии, что весь сайт содержится в папке с именем public
):
use Rack::Static,
:urls => ["/images", "/js", "/css"],
:root => "public",
:index => 'index.html'
run Rack::File.new("public")