obsługuje bieżący katalog z wiersza poleceń

94

czy ktoś mógłby mi podpowiedzieć, jak obsłużyć bieżący katalog z wiersza poleceń za pomocą ruby? byłoby wspaniale, gdybym mógł mieć jakąś konfigurację dla całego systemu (np. typy MIME) i po prostu uruchamiać ją z każdego katalogu.

Sebastian
źródło

Odpowiedzi:

204

Najprostszy możliwy sposób (dzięki Aaron Patterson / n0kada):

ruby -run -e httpd . -p 9090

Alternatywny, bardziej złożony sposób:

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

Nawet pierwsze polecenie jest trudne do zapamiętania, więc mam to w moim .bashrc:

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

Domyślnie obsługuje bieżący katalog na porcie 3000 , ale możesz również określić port:

~ $ cd tmp
~/tmp $ serve      # ~/tmp served on port 3000
~/tmp $ cd ../www
~/www $ serve 5000   # ~/www served on port 5000
Daniel Perez Alvarez
źródło
Jeśli korzystasz z systemu Windows, czy można dodać to do cmd lub PowerShell jako funkcję?
Caleb,
@Daniel - kiedy uruchomię Twój One Liner na moim Macu. Otrzymałem ten komunikat o błędzie: niezainicjalizowana stała INT (NameError). Czy używasz go na innej platformie? Czy wiesz, jak mogę tego uniknąć? Ale jeśli zapiszę to do pliku, powiedzmy myserver.rb, a potem zrobię „ruby myserver.rb”, wszystko działa dobrze.
Tony Jiang
@TonyJiang Używam też komputera Mac. Wypróbowałem to z Ruby 1.8.7, 1.9.3 i 2.0.0 i wszystkie działają. Dziwne.
Daniel Perez Alvarez
7
Aby usunąć mistyfikację, ruby -run -e httpd . -p 9090spójrz na ruby-doc.org/stdlib-2.0.0/libdoc/un/rdoc/index.html . Wykonuje metodę httpd ze unstandardowej biblioteki ruby, dlatego wymaga un.
Gee-Bee,
1
@Deviljho, jeśli korzystasz z systemu Mac lub Linux, po prostu dodaj znak ampersand na końcu polecenia, aby wysłać go na tło: ruby -run -e httpd . -p 9090 & Jeśli chcesz przywrócić go na pierwszy plan, użyj fg.
Daniel Perez Alvarez
5
require 'webrick'
include WEBrick

s = HTTPServer.new(:Port => 9090,  :DocumentRoot => Dir::pwd)
trap("INT"){ s.shutdown }
s.start
rogerdpack
źródło
4

Użyj ruby ​​gem Serve .

Aby zainstalować w systemie, uruchom gem install serve.

Aby udostępnić katalog, po prostu przejdź do katalogu i uruchom serve.

Domyślny port to 4000. Może również obsługiwać takie elementy, jak ERB, HAML, Slim i SASS.

jellymann
źródło
3

Serwer WWW w 1 linii


To może, ale nie musi być tym, czego chcesz, ale jest tak fajne, że po prostu musiałem się tym podzielić.

Używałem tego w przeszłości do obsługi systemu plików. Być może mógłbyś go zmodyfikować lub po prostu zaakceptować, że służy wszystkim.

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

Znalazłem to tutaj

Chris

Chris McCauley
źródło
3

Możesz użyć sinatraklejnotu, chociaż nie wykonuje on dla ciebie żadnej listy katalogów, obsługuje pliki:

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

następnie uruchom go jako plik, jeśli w 1.8 dodaj najpierw wymagaj 'rubygems' na górze.

Po uruchomieniu to adres URL jest podobny

http: // localhost: 4567 / nazwa_pliku

powinien zostać rozwiązany do pliku „./file_name”.

Jednak http: // localhost: 4567 nie będzie działać, ponieważ nie „wykonuje” list katalogów. Zobacz https://stackoverflow.com/a/12115019/32453, aby znaleźć obejście tego problemu.

rogerdpack
źródło
zainstaluj sinatra gem $ gem zainstaluj sinatrę, a następnie zapisz ten tekst w pliku somefile.rb, a następnie uruchom go
rogerdpack
Nie, to znaczy Sinatra podaje mi błąd: Sinatra nie zna tej drobiazgowości.
eveevans
@eveevans właśnie zauważył Twój komentarz [LOL sorry], zaktualizowany teraz.
rogerdpack
1
python3 -m http.server

lub jeśli nie chcesz używać domyślnego portu 8000

python3 -m http.server 3333

lub jeśli chcesz zezwolić na połączenia tylko z hosta lokalnego

python3 -m http.server --bind 127.0.0.1

Zobacz dokumentację .

Boris
źródło