phục vụ thư mục hiện tại từ dòng lệnh


94

ai đó có thể cho tôi một gợi ý, làm thế nào để phục vụ thư mục hiện tại từ dòng lệnh với ruby? sẽ thật tuyệt, nếu tôi có thể có một số cấu hình toàn hệ thống (ví dụ như kiểu mime) và chỉ cần khởi chạy nó từ mọi thư mục.

Câu trả lời:


203

Cách đơn giản nhất có thể (cảm ơn Aaron Patterson / n0kada):

ruby -run -e httpd . -p 9090

Cách thay thế, phức tạp hơn:

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

Ngay cả lệnh đầu tiên cũng khó nhớ, vì vậy tôi chỉ có điều này trong .bashrc:

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

Nó phục vụ thư mục hiện tại trên cổng 3000 theo mặc định, nhưng bạn cũng có thể chỉ định cổng:

~ $ cd tmp
~/tmp $ serve      # ~/tmp served on port 3000
~/tmp $ cd ../www
~/www $ serve 5000   # ~/www served on port 5000

Nếu bạn đang sử dụng windows, có thể thêm nó vào cmd hoặc powershell dưới dạng một hàm không?
Caleb

@Daniel - khi tôi chạy một lớp lót của bạn trên máy Mac của tôi. Tôi nhận được thông báo lỗi này: hằng số INT (NameError) chưa được khởi tạo. Bạn có đang chạy nó trên một nền tảng khác không? Bạn có biết làm thế nào tôi có thể tránh điều này? Nhưng nếu tôi viết nó vào một tệp nói rằng myserver.rb sau đó làm "ruby myserver.rb", nó hoạt động tốt.
Tony Jiang

@TonyJiang Tôi cũng đang chạy trên máy Mac. Đã thử nó với Ruby 1.8.7, 1.9.3 và 2.0.0, và tất cả chúng đều hoạt động. Kỳ dị.
Daniel Perez Alvarez

7
Để khử phân loại, ruby -run -e httpd . -p 9090hãy xem ruby-doc.org/stdlib-2.0.0/libdoc/un/rdoc/index.html . Nó thực thi phương thức httpd từ unthư viện chuẩn ruby, do đó yêu cầu un.
Gee-Bee

1
@Deviljho nếu bạn đang chạy trên Mac hoặc Linux, chỉ cần thêm dấu và vào cuối lệnh để gửi nó xuống nền: ruby -run -e httpd . -p 9090 & Nếu bạn muốn đưa nó trở lại nền trước, hãy sử dụng fg.
Daniel Perez Alvarez



5
require 'webrick'
include WEBrick

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

4

Sử dụng đá quý ruby Phục vụ .

Để cài đặt trên hệ thống của bạn, hãy chạy gem install serve.

Để phục vụ một thư mục, chỉ cần cd vào thư mục và chạy serve.

Cổng mặc định là 4000. Nó cũng có thể phục vụ những thứ như ERB, HAML, Slim và SASS.


3

Máy chủ Web trong 1 dòng


Điều này có thể có hoặc không hoàn toàn như những gì bạn muốn nhưng nó rất tuyệt nên tôi phải chia sẻ nó.

Tôi đã sử dụng điều này trước đây để phục vụ hệ thống tệp. Có lẽ bạn có thể sửa đổi nó hoặc chỉ chấp nhận rằng nó phục vụ mọi thứ.

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

Tôi tìm thấy nó ở đây

Chris


3

Bạn có thể sử dụng sinatragem, mặc dù nó không thực hiện bất kỳ danh sách thư mục nào cho bạn, nó phục vụ các tệp:

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

sau đó chạy tệp đó dưới dạng tệp, nếu trong 1.8, thêm yêu cầu 'rubygems' lên trên cùng trước.

Sau khi chạy nó thì url giống như

http: // localhost: 4567 / file_name

sẽ giải quyết thành tệp "./file_name".

Tuy nhiên, http: // localhost: 4567 sẽ không hoạt động vì nó không "làm" danh sách thư mục. Xem https://stackoverflow.com/a/12115019/32453 để biết cách giải quyết khác tại đó.


cài đặt Sinatra ngọc $ gem install Sinatra sau đó tiết kiệm văn bản này để somefile.rb sau đó chạy nó
rogerdpack

Không, ý tôi là, Sinatra cho tôi lỗi: Sinatra không biết điều này.
eveevans 19/12/12

@eveevans bằng cách nào đó vừa nhận thấy nhận xét của bạn [LOL - Liên minh huyền thoại], được cập nhật ngay bây giờ.
rogerdpack

1
python3 -m http.server

hoặc nếu bạn không muốn sử dụng cổng mặc định 8000

python3 -m http.server 3333

hoặc nếu bạn chỉ muốn cho phép kết nối từ localhost

python3 -m http.server --bind 127.0.0.1

Xem tài liệu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.