かみぽわーる

kamipo's blog

簡単に手元でHTTPのファイルサーバ立てる方法

.zshrcstatic_httpdって関数つくってる。

dotfiles/.zshrc at master · kamipo/dotfiles · GitHub

function static_httpd {
  if type plackup > /dev/null; then
    plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root => ".")->to_app'
  elif type ruby > /dev/null; then
    if ruby -v | grep -qm1 'ruby 2\.'; then
      ruby -run -e httpd -- --port=5000 .
    else
      ruby -rwebrick -e 'WEBrick::HTTPServer.new(:Port => 5000, :DocumentRoot => ".").start'
    fi
  elif type python > /dev/null; then
    if python -V 2>&1 | grep -qm1 'Python 3\.'; then
      python -m http.server 5000
    else
      python -m SimpleHTTPServer 5000
    fi
  elif type node > /dev/null; then
    node -e "var c=require('connect'), d=process.env.PWD; c().use(c.logger()).use(c.static(d)).use(c.directory(d)).listen(5000);"
  elif type php > /dev/null && php -v | grep -qm1 'PHP 5\.[45]\.'; then
    php -S 0.0.0.0:5000
  elif type erl > /dev/null; then
    erl -eval 'inets:start(), inets:start(httpd, [{server_name, "httpd"}, {server_root, "."}, {document_root, "."}, {port, 5000}])'
  fi
}

むかしはplackupだけ書いてたんだけど、あんまりPerlつかってなかった時期にPlack入れてるかどうか自信ないとすぐにHTTPD上げれないから、そのときにとりあえずHTTPD上げれそうなやつ調べて全部書いておいた。

この中だとRubyPythonが標準モジュールだけでディレクトリインデックス表示できる。

追記

Python3ではSimpleHTTPServerがなくなってhttp.serverになっているそうなので、python2かpython3かを.zshrcに追加しておきました!

    if python -V 2>&1 | grep -qm1 'Python 3\.'; then
      python -m http.server 5000
    else
      python -m SimpleHTTPServer 5000
    fi

追記おわり。

Perlはディレクトリインデックス表示だとPlackPlack::App::Directory入れてないといけないけど、Perlは標準モジュールが貧弱なんでPerlでWeb開発してる人は必ず入れてるからまあよしとします。

PHPは5.4以降のbuilt-in web serverが使えるけどディレクトリインデックスは表示できなかった。

あとNodeも試したんだけど、まずconnect入れないとワンライナーじゃ無理そうなのと、カレントディレクトリをドキュメントルートにできなくてサブディレクトリにしないといけなかったので含めなかった。こんな感じ。

node -e "var connect=require('connect'); connect().use(connect.static('public')).use(connect.logger()).listen(5000);"
追記

@process.env.PWDでフルパス指定すればいけることを教えてもらいました!__dirnameは試したんだけどワンライナーだと'.'になってダメで諦めてた…。ディレクトリインデックスがかっこよかった。

node -e "var c=require('connect'), d=process.env.PWD; c().use(c.logger()).use(c.static(d)).use(c.directory(d)).listen(5000);"

追記おわり。

あとErlangはちょっとやってみたかっただけのオマケです。