sbt 1.1.0-RC1 の sbt server と統一スラッシュ構文

Lightbend の技術系ブログ Tech Hub blog に sbt 1.1.0-RC1 with sbt server and slash syntax という記事を書いたので、訳しました。

@eed3si9n

皆さんこんにちは。Lightbend Tooling team にかわって sbt 1.1.0-RC1 をアナウンスします。これは、sbt 1 初のフィーチャーリリースで、バイナリ互換性は維持しつつ新機能にフォーカスを当てたリリースとなっている。 sbt 1 は Semantic Versioning にもとづいてリリースされるので、プラグインは sbt 1.x シリーズ中機能することが期待されている。2017年12月14日までに大きな問題が見つからなければ、1.1.0-RC1 は 1.0.0 final 版となる予定だ。

sbt 1.1 の主な新機能は統一スラッシュ構文 (unified slash syntax) と sbt server だ。これらは両方とも僕が個人的にしばらく関わってきた機能だが、sbt 1.0 には入れずに延期させたものだ。そのため、やっとこれらを世に出せるのがひとしお嬉しい。

セッティングキーの統一スラッシュ構文

sbt の 1ユーザとして、sbt シェルと build.sbt でセッティングとタスクキーに 2つの表記方法があるのが、sbt の学習を難しくしている理由だと長いこと思ってきた。コミュニティーの皆さんと議論を重ね、いくつかのプロトタイプを作った後、sbt 1.1.0-RC1 より統一スラッシュ構文がサポートされることになった。 (sbt 0.13 表記も引き続き動作するのでご心配無く)

build.sbt と sbt shell の両方において、セッティングはスコープ軸をスラッシュで分けて以下のように書くことができる:

ref / Config / intask / key

上の ref は典型的にはサブプロジェクト名もしくは ThisBuild が入り、ConfigCompileTest などコンフィギュレーションの Scala 識別子が入る。それぞれの軸は省略するか、特殊な Zero という値で置き換えることが可能なので、実際は以下のようになっている:

((ref | "Zero") "/") ((Config | "Zero") "/") ((intask | "Zero") "/") key

具体例で説明すると、sbt 0.13 では:

一方 sbt 1.1.0-RC1 では:

以下はデモだ:

slash

詳細は Migrating to slash syntaxスコープのドキュメンテーションを参照。

注意: プラグイン作者の皆さんに注意してほしいのは、この新構文をプラグインで使うと動作可能な最小 sbt バージョンが sbt 1.1.0-RC1 に引き上がってしまうことだ。

#1812/#3434/#3617/#3620 by @eed3si9n and @dwijnand

sbt server

「sbt server」という名前を聞くと、リモートのサーバで走って、何かすごいことをやってくれるんじゃないかと想像するかもしれない。しかし、今のところ sbt server はそれではない。sbt server は単に sbt shell にネットワークからのアクセスを追加するだけだ。sbt 1.1 はこの機能を刷新して Language Server Protocol 3.0 (LSP) をワイヤープロトコルとして採用した。これは、Microsoft 社が Visual Studio Code のために開発したプロトコルだ。

実行中のサーバを発見するには、sbt 1.1.0 はビルドから見て ./project/target/active.json にポートファイルを作成するので、それを見つける:

{"uri":"local:///Users/foo/.sbt/1.0/server/0845deda85cb41abcdef/sock"}

ここで local: は Unix ドメインソケットを表している。nc を用いてサーバに hello と言うには以下を実行する (^M を発信するには Ctrl-V を打ってから Return を打つ):

$ nc -U /Users/foo/.sbt/1.0/server/0845deda85cb41abcdef/sock
Content-Length: 99^M
^M
{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "initializationOptions": { } } }^M

compile は以下のように行う:

Content-Length: 93^M
^M
{ "jsonrpc": "2.0", "id": 2, "method": "sbt/exec", "params": { "commandLine": "compile" } }^M

これで、現在実行中の sbt セッションは compile をキューに加え、もしコンパイラ警告やエラーがあれば、メッセージを返すはずだ:

Content-Length: 296
Content-Type: application/vscode-jsonrpc; charset=utf-8

{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:/Users/foo/work/hellotest/Hello.scala","diagnostics":[{"range":{"start":{"line":2,"character":26},"end":{"line":2,"character":27}},"severity":1,"source":"sbt","message":"object X is not a member of package foo"}]}}

これによって、複数のクライアントが単一の sbt セッションに接続することが可能となる。クライアントの主な用途はエディタや IDE といったツーリングの統合を想定している。詳細に関しては sbt server を参照。

#3524/#3556 by @eed3si9n

VS Code エクステンション

エディタ統合の概念実証として、Scala (sbt) という Visual Studio Code エクステンションを作ってみた。これを試すには、Visual Studio Code をインストールして、「Scala (sbt)」 を Extensions タブから検索して、sbt 1.1.0-RC1 を何らかのプロジェクトから実行して、VS Code を使ってそのプロジェクトを開く。

今のところこのエクステンションが可能なのは:

以下はデモだ:

vscode-scala-sbt

その他のバグ修正や改善点

参加

sbt や Zinc 1 を実際に使ったり、バグ報告、ドキュメンテーションの改善、ビルドの移植、プラグインの移植、pull request をレビューしたり送ってくれた皆さん、ありがとうございます。

sbt, zinc, librarymanagement, util, io, website などのモジュールで実行した git shortlog -sn --no-merges v1.0.4..v1.1.0-RC によると、sbt 1.1.0-RC1 は 32名のコントリビュータのお陰でできました (敬称略): Eugene Yokota, Dale Wijnand, Kenji Yoshida (xuwei-k), Alexey Alekhin, Simon Schäfer, Jorge Vicente Cantero (jvican), Miklos Martin, Jeffrey Olchovy, Jonas Fonseca, Andrey Artemov, Arnout Engelen, Dominik Winter, Krzysztof Romanowski, Roman Iakovlev, Wiesław Popielarski, Age Mooij, Allan Timothy Leong, Antonio Cunei, Jason Zaugg, Jilen Zhang, Long Jinwei, Martin Duhem, Michael Stringer, Michael Wizner, Nud Teeraworamongkol, OlegYch, PanAeon, Philippus Baalman, Pierre Dal-Pra, Saniya Tech, Tom Walford, その他大勢の人のアイディアも得ている。 Thank you!

sbt を手伝ってみたいと興味があれば、好みによって色々な方法があります。

他にもアイディアがあれば、sbt-contrib で声をかけてください。