servir o diretório atual da linha de comando

94

alguém poderia me dar uma dica, como servir o diretório atual da linha de comando com o ruby? seria ótimo se eu pudesse ter alguma configuração de todo o sistema (por exemplo, tipos mime) e simplesmente iniciá-lo de todos os diretórios.

Sebastian
fonte

Respostas:

203

Maneira mais simples possível (obrigado Aaron Patterson / n0kada):

ruby -run -e httpd . -p 9090

Forma alternativa e mais complexa:

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

Mesmo o primeiro comando é difícil de lembrar, então eu só tenho isso no meu .bashrc:

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

Ele serve o diretório atual na porta 3000 por padrão, mas você também pode especificar a porta:

~ $ cd tmp
~/tmp $ serve      # ~/tmp served on port 3000
~/tmp $ cd ../www
~/www $ serve 5000   # ~/www served on port 5000
Daniel Perez Alvarez
fonte
Se você estiver no Windows, é possível adicionar isso ao cmd ou ao PowerShell como uma função?
Caleb,
@Daniel - quando executo o seu único liner no meu Mac. Recebi esta mensagem de erro: constante não inicializada INT (NameError). Você está executando em uma plataforma diferente? Você sabe como posso evitar isso? Mas se eu escrever em um arquivo, diga myserver.rb e depois execute "ruby myserver.rb", ele funcionará bem.
Tony Jiang
@TonyJiang Também estou executando em um Mac. Tentei com Ruby 1.8.7, 1.9.3 e 2.0.0, e todos eles funcionam. Esquisito.
Daniel Perez Alvarez
7
Para desmistificar, ruby -run -e httpd . -p 9090olhe para ruby-doc.org/stdlib-2.0.0/libdoc/un/rdoc/index.html . Ele está executando o método httpd da unbiblioteca padrão do ruby, portanto, requer un.
Gee-Bee,
1
@Deviljho se você estiver executando no Mac ou Linux, basta adicionar um "e" comercial no final do comando para enviá-lo para o fundo: ruby -run -e httpd . -p 9090 & Se você quiser trazê-lo de volta para o primeiro plano, use fg.
Daniel Perez Alvarez
21

Como Aaron Patterson tweetou hoje, você pode fazer:

ruby -run -e httpd . -p 5000

E você também pode definir o endereço de ligação adicionando -b 127.0.0.1

Funciona com Ruby 1.9.2 e superior.

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

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

Use servir gema de rubi .

Para instalar em seu sistema, execute gem install serve.

Para servir um diretório, simplesmente faça cd para o diretório e execute serve.

A porta padrão é 4000. Ela também pode servir coisas como ERB, HAML, Slim e SASS.

Jellymann
fonte
3

Servidor Web em 1 linha


Isso pode ou não ser bem o que você deseja, mas é tão legal que eu apenas tive que compartilhar.

Eu usei isso no passado para servir ao sistema de arquivos. Talvez você possa modificá-lo ou simplesmente aceitar que serve a tudo.

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

Eu encontrei aqui

Chris

Chris McCauley
fonte
3

Você pode usar o sinatragem, embora ele não faça nenhuma listagem de diretório para você, ele serve os arquivos:

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

em seguida, execute-o como um arquivo, se em 1.8 adicione require 'rubygems' ao topo primeiro.

Depois de executá-lo, o URL é como

http: // localhost: 4567 / file_name

deve resolver para o arquivo "./file_name".

http: // localhost: 4567 não funcionará no entanto, uma vez que não "faz" listagens de diretório. Consulte https://stackoverflow.com/a/12115019/32453 para uma solução alternativa.

rogerdpack
fonte
instale o sinatra gem $ gem instale o sinatra e salve este texto em somefile.rb e execute-o
rogerdpack
Não, quer dizer, o Sinatra me dá o erro: o Sinatra não conhece essa cantiga.
eveevans
@eveevans de alguma forma acabou de notar seu comentário [LOL desculpe], atualizado agora.
rogerdpack de
1
python3 -m http.server

ou se você não quiser usar a porta padrão 8000

python3 -m http.server 3333

ou se você deseja permitir conexões de localhost apenas

python3 -m http.server --bind 127.0.0.1

Veja a documentação .

Boris
fonte