обслуживать текущий каталог из командной строки

94

может кто-нибудь дать мне подсказку, как обслуживать текущий каталог из командной строки с помощью ruby? было бы здорово, если бы я мог иметь некоторую общесистемную конфигурацию (например, mime-типы) и просто запускать ее из каждого каталога.

Себастьян
источник

Ответы:

204

Самый простой способ (спасибо Аарону Паттерсону / n0kada):

ruby -run -e httpd . -p 9090

Альтернативный, более сложный способ:

ruby -r webrick -e "s = WEBrick::HTTPServer.new(:Port => 9090, :DocumentRoot => Dir.pwd); trap('INT') { s.shutdown }; s.start"

Даже первую команду сложно запомнить, поэтому у меня просто есть это .bashrc:

function serve {
  port="${1:-3000}"
  ruby -run -e httpd . -p $port
}

По умолчанию он обслуживает текущий каталог на порту 3000 , но вы также можете указать порт:

~ $ cd tmp
~/tmp $ serve      # ~/tmp served on port 3000
~/tmp $ cd ../www
~/www $ serve 5000   # ~/www served on port 5000
Даниэль Перес Альварес
источник
Если вы используете Windows, можно ли добавить это в cmd или powershell как функцию?
Калеб
@Daniel - когда я запускаю твой лайнер на моем Mac. Я получил это сообщение об ошибке: неинициализированная константа INT (NameError). Вы запускаете его на другой платформе? Вы знаете, как я могу этого избежать? Но если я запишу его в файл, скажем, myserver.rb, затем сделаю «ruby myserver.rb», он будет работать нормально.
Тони Цзян
@TonyJiang Я тоже работаю на Mac. Пробовал с Ruby 1.8.7, 1.9.3 и 2.0.0, и все они работают. Странно.
Даниэль Перес Альварес,
7
Чтобы демистифицировать, ruby -run -e httpd . -p 9090посмотрите ruby-doc.org/stdlib-2.0.0/libdoc/un/rdoc/index.html . Он выполняет метод httpd из unстандартной библиотеки ruby, поэтому требует un.
Джи-Би,
1
@Deviljho, если вы работаете на Mac или Linux, просто добавьте амперсанд в конце команды, чтобы отправить ее в фоновый режим: ruby -run -e httpd . -p 9090 & если вы хотите вернуть ее на передний план, используйте fg.
Даниэль Перес Альварес
5
require 'webrick'
include WEBrick

s = HTTPServer.new(:Port => 9090,  :DocumentRoot => Dir::pwd)
trap("INT"){ s.shutdown }
s.start
Роджердпак
источник
4

Используйте рубин драгоценный камень Serve .

Чтобы установить в вашей системе, запустите gem install serve.

Чтобы обслужить каталог, просто перейдите к нему cd и запустите serve.

Порт по умолчанию - 4000. Он также может обслуживать такие вещи, как ERB, HAML, Slim и SASS.

Jellymann
источник
3

Веб-сервер в 1 строку


Это может быть или не совсем то, что вы хотите, но это настолько круто, что мне просто пришлось поделиться этим.

Я использовал это в прошлом для обслуживания файловой системы. Возможно, вы могли бы изменить его или просто признать, что он служит всему.

ruby -rsocket -e 's=TCPServer.new(5**5);loop{_=s.accept;_<<"HTTP/1.0 200 OK\r\n\r\n#{File.read(_.gets.split[1])rescue nil}";_.close}'

Я нашел это здесь

Крис

Крис МакКоли
источник
3

Вы можете использовать sinatraгем, хотя он не делает для вас список каталогов, он обслуживает файлы:

require 'sinatra' # gem
set :public_folder, '.'

затем запустите это как файл, если в 1.8 сначала добавьте require 'rubygems' в начало.

После его запуска URL-адрес вроде

http: // localhost: 4567 / имя_файла

должен разрешиться в файл "./file_name".

http: // localhost: 4567 , однако, не будет работать, так как он не "выполняет" списки каталогов. См. Https://stackoverflow.com/a/12115019/32453 для обходного пути.

Роджердпак
источник
установить sinatra gem $ gem install sinatra затем сохранить этот текст в somefile.rb и запустить его
rogerdpack
Нет, я имею в виду, Синатра дает мне ошибку: Синатра не знает этой частушки.
eveevans
@eveevans почему-то только что заметил ваш комментарий [LOL, извините], сейчас обновлен.
rogerdpack 01
1
python3 -m http.server

или если вы не хотите использовать порт по умолчанию 8000

python3 -m http.server 3333

или если вы хотите разрешить соединения только с localhost

python3 -m http.server --bind 127.0.0.1

См. Документы .

Борис
источник