Martiniでstatic fileが返せない

諸事情で、ちょっとサンプル的なプロジェクトを作成しており、利用するフレームワークとかアーキテクチャは自分で利用できるので、今回初めてGolangでのWebアプリケーション実装をやってみています。

フレームワークとしては

  • Revel
  • Martini
  • BeeGo

などがメジャーどころのようですが、今回はフルスタックを利用するまでもないだろう、ということで Martiniを選択しました。Sinatraライクということで、それなりにとっつきやすそう、というのポイントでした。

静的ファイルが取れない

とりあえずHello, Worldを実行して、実際にファイルを配置して試しに表示してみようとしたところ、

[martini] listening on :3000 (development)
[martini] Started GET /public/css/main.css for [::1]:46776
[martini] Completed 404 Not Found in 245.092us

みたいなエラーが山程出てきました。言うまでもなく、/public/css/main.cssは静的ファイルです。とりあえず、なんでかは知りませんが、Martiniがこれを普通のリクエストと勘違いして、んなHandlerはねぇ!と言っているのはわかります。

ですが、公式ページにちゃんと?こう書いてあります。

Serving Static Files

A martini.Classic() instance automatically serves static files from the "public" directory in the root of your server. You can serve from more directories by adding more martini.Static handlers.

サーバーのrootにあるpublicディレクトリへのアクセスは静的ファイルへのアクセスである、とデフォルトでやってあるようです。

原因

まさかこんなところで引っ掛かると思ってなかったでちょっと焦りましたが、martini/static.goにログを追加して確認してみたところ、public/public/... のようなファイルを見るような感じになっていることがわかりました。これが原因でした。

martiniを使っているときに、CSSとかJsとかを読み込むときは、public/からの相対パス絶対パスとしてアクセスするのがわかりやすいかと思いました。

(public/css/main.cssだったら、/css/main.cssとやる)

しかし、こんなところでひっかかる奴もいないのか、検索しても情報が出てこないのは焦りました。Martiniはかなりスモールなので、ソースを読むのがそんなに苦にならないのが助かりました。