servir el directorio actual desde la línea de comandos

94

¿Alguien podría darme una pista, cómo servir el directorio actual desde la línea de comando con ruby? Sería genial, si pudiera tener alguna configuración de todo el sistema (por ejemplo, tipos mime) y simplemente ejecutarlo desde cada directorio.

Sebastián
fuente

Respuestas:

203

La forma más sencilla posible (gracias Aaron Patterson / n0kada):

ruby -run -e httpd . -p 9090

Manera alternativa, más compleja:

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

Incluso el primer comando es difícil de recordar, así que solo tengo esto en mi .bashrc:

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

Sirve el directorio actual en el puerto 3000 de forma predeterminada, pero también puede especificar el puerto:

~ $ cd tmp
~/tmp $ serve      # ~/tmp served on port 3000
~/tmp $ cd ../www
~/www $ serve 5000   # ~/www served on port 5000
Daniel Pérez Alvarez
fuente
Si está en Windows, ¿es posible agregar esto a cmd o powershell como una función?
Caleb
@Daniel: cuando ejecuto tu única línea en mi Mac. Recibí este mensaje de error: INT constante no inicializada (NameError). ¿Lo está ejecutando en una plataforma diferente? ¿Sabes cómo puedo evitar esto? Pero si lo escribo en un archivo, diga myserver.rb y luego "ruby myserver.rb", funciona bien.
Tony Jiang
@TonyJiang También estoy usando una Mac. Lo probé con Ruby 1.8.7, 1.9.3 y 2.0.0, y todos funcionan. Extraño.
Daniel Perez Alvarez
7
Para desemistificar, ruby -run -e httpd . -p 9090consulte ruby-doc.org/stdlib-2.0.0/libdoc/un/rdoc/index.html . Está ejecutando el método httpd de unla biblioteca estándar de ruby, por lo que requiere un.
Gee-Bee
1
@Deviljho si está ejecutando en Mac o Linux, simplemente agregue un ampersand al final del comando para enviarlo a segundo plano: ruby -run -e httpd . -p 9090 & si desea traerlo de vuelta al primer plano, use fg.
Daniel Perez Alvarez
21

Como lo tuiteó Aaron Patterson hoy, puedes hacer:

ruby -run -e httpd . -p 5000

Y también puede configurar la dirección de enlace agregando -b 127.0.0.1

Funciona con Ruby 1.9.2 y superior.

KARASZI István
fuente
5
require 'webrick'
include WEBrick

s = HTTPServer.new(:Port => 9090,  :DocumentRoot => Dir::pwd)
trap("INT"){ s.shutdown }
s.start
Rogerdpack
fuente
4

Use ruby ​​gem Servir .

Para instalar en su sistema, ejecute gem install serve.

Para servir un directorio, simplemente cd al directorio y ejecutar serve.

El puerto predeterminado es 4000. También puede servir para cosas como ERB, HAML, Slim y SASS.

jellymann
fuente
3

Servidor web en 1 línea


Esto puede o no ser exactamente lo que quieres, pero es tan genial que tuve que compartirlo.

He usado esto en el pasado para servir el sistema de archivos. Quizás podrías modificarlo o simplemente aceptar que sirve para todo.

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}'

Lo encontré aquí

Chris

Chris McCauley
fuente
3

Puede usar la sinatragema, aunque no hace ninguna lista de directorios por usted, sirve archivos:

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

luego ejecútelo como un archivo, si en 1.8 agregue primero require 'rubygems' en la parte superior.

Después de ejecutarlo, la URL es como

http: // localhost: 4567 / nombre_archivo

debería resolverse en el archivo "./file_name".

http: // localhost: 4567 no funcionará sin embargo, ya que no "hace" listados de directorios. Consulte https://stackoverflow.com/a/12115019/32453 para obtener una solución alternativa.

Rogerdpack
fuente
instalar sinatra gem $ gem instalar sinatra luego guardar este texto en somefile.rb y luego ejecutarlo
rogerdpack
No, quiero decir, Sinatra me da el error: Sinatra no conoce esta cancioncilla.
Eveevans
@eveevans de alguna manera acaba de notar tu comentario [LOL sorry], actualizado ahora.
rogerdpack
1
python3 -m http.server

o si no desea utilizar el puerto predeterminado 8000

python3 -m http.server 3333

o si desea permitir conexiones solo desde localhost

python3 -m http.server --bind 127.0.0.1

Consulte los documentos .

Boris
fuente