Play 2.3から採用されるというsbt-webをUnfilteredで使う 2014年02月20日

最近Play 2.3から採用されるというsbt-webをちょっと見てます。

sbt-web pluginとplayframework2.3 - scalaとか・・・

sbt/sbt-web

sbt-web 1.0.0-M1 is available - Google グループ

Typesafeがsbt-webを作ってるのは、PlayからJavaScriptやCSSなど(以下アセット)のクライアントサイドの機能を分離したいという意向があるみたいですね。

sbt-webは単体で使うものではなく、他のプラグインに対する基盤の機能を提供しています。

などの機能があるようです。

それで、このsbt-webの上にJavaScriptを実行するためのsbt-js-engineというプラグインがあったり、 そのsbt-js-engineを使ってLESSをコンパイルするためのsbt-less-pluginや、 JavaScriptにJSHintを通すsbt-jshint-pluginなどが作られていたり、機能が階層的に作られてるみたいです。

sbt-webはPlay用だと思うのですが、クライアントサイドの機能は他のScalaのフレームワークでも弱い部分だと思うので、ためしに別のWebフレームワークのUnfilteredでsbt-less-pluginを使ってみました。

unfiltered/unfiltered

sbt/sbt-less-plugin

基本的にはほとんどそのままで使えるのですが、sbt-web標準のディレクトリ構成だとコンパイルされたCSSをJavaのリソースとして読めないので、アセットの生成先の設定だけ変更します。

resourceManaged in WebKeys.Assets := (classDirectory in Compile).value / "public"

というコードをbuild.sbtに書きます。これで、たとえば src/main/assets/css/app.less に置いたファイルがコンパイルされて、 getClass.getResource("/public/css/app.css")という感じに読み込めるようになります。

Unfilteredで使えるようにするには

object Server extends App {
  Http(8080).resources(getClass.getResource("/public")).filter(Planify(Directive.Intent {
    case Path("/") =>
      for {
        _ <- GET
      } yield Html(
        <html>
          <head>
            <link rel="stylesheet" type="text/css" href="/css/app.css" />
          </head>
          <body>
            <h1>Title</h1>
            <div id="container">
              <p><a href="https://github.com/unfiltered/unfiltered">unfiltered/unfiltered</a></p>
            </div>
          </body>
        </html>
      )
  })).run()
}

という感じにresourcesメソッドにディレクトリを指定すると読めるようになります。 sbt-webによりディレクトリ構成が標準化されているのでsbt-less-plugin以外の他のプラグインでも同様に使えるはずです。

全体のサンプルはこちらになります。

hexx/unfiltered-sbt-web-sample

簡単に使えるんで、これからsbt-web関連のプラグインが増えてきたら色々便利そうな気がしますね。