移植に関しては Migrating from sbt 0.13.x も参照。
.copy(foo = xxx)
は withFoo(xxx)
に書き換える必要がある。例えば、UpdateConfiguration
、 RetrieveConfiguration
、 PublishConfiguration
などはビルダーパターンを使うようにリファクタリングした。
config("xyz")
は、val Xyz = config("xyz")
のように 頭文字が大文字の val
に直接代入する必要がある。これは左辺項の識別子を捕捉して後でシェルから使えるようにするためだ。
publishTo
と otherResolvers
は SettingKey から TaskKey へと変更した。#2059/#2662 by @dwijnand
Path.relativizeFile(baseFile, file)
は IO.relativizeFile(baseFile, file)
へと名前が変わった。
PathFinder
の .***
メソッドは .allPaths
メソッドへと名前が変わった。
PathFinder.x_!(mapper)
は PathFinder
の def pair
に変更された。
sbt.Path
の多くのメソッド (relativeTo
、rebase
、 flat
など) は以前は sbt
のパッケージオブジェクト経由でデフォルトの名前空間に入っていたが、それが無くなったので sbt.io.Path
を使ってアクセスしてほしい。
Global
を Zero
と名前を変えて、GlobalScope
と区別するようにした。 @eed3si9n
update.value.configuration(...)
のような所でコンフィギュレーションを参照するのに文字列が使われていたのを、ConfigRef
を使うように変更した。
sourceArtifactTypes
と docArtifactTypes
を Set[String]
から Seq[String]
セッティングへと変更した。
--<command>
という構文から early(<command>)
へと変更した。
publish-local
から publishLocal
に移行する)。
"early(error)"
などの代わりに -error
、 -warn
、 -info
、 -debug
オプションを追加した。
sbt.Process
と sbt.ProcessExtra
は撤廃した。scala.sys.process
に移行する。
incOptions.value.withNameHashing(...)
はオプションは無くなる。
TestResult.Value
は TestResult
に名前を変更する。
%%
を使う必要がある。
以前より廃止勧告が出ていて、今回撤廃されたもの:
Build
trait は sbt 0.13.12 に廃止勧告となり、この度削除した。build.sbt へと移行する必要がある。Auto plugin と Build
trait は相性が悪く、またこの機能は既に普及しているマルチプロジェクト build.sbt によって置き換えられた。
Project(...)
コンストラクタは、2つのパラメータを受け取るものだけに制限する。これは、settings
パラメータは Auto plugin と相性が悪いからだ。代わりに、project
を使ってほしい。
<<=
, <+=
, <++=
は撤廃した。:=、 +=、および ++= 演算子へと移行してほしい。古い演算子は多くのユーザにとって混乱の元となっており、長らく 0.13 のドキュメンテーションからは削除され、sbt 0.13.13 以降正式に撤廃勧告が出ていた。
sbt.Plugin
を撤廃した。AutoPlugin
へと移行してほしい。Auto plugin の方が設定が簡単で、プラグイン間の協調が可能だからだ。
Project
より settingsSet
メソッドおよび add/setSbtFiles
を削除する。
InputTask
apply
メソッドと inputTask
DSL メソッドを撤廃する。Def.inputTask
と Def.spaceDelimited().parsed
へと移行してほしい。
ProjectReference
への暗黙の変換を撤廃する。RootProject(<uri>)
、RootProject(<file>)
、もしくは LocalProject(<string>)
へと移行してほしい。
seq(...)
DSL メソッドを撤廃する。Seq(...)
を使うか、そのまま setting を渡すようにしてほしい。
File
/Seq[File]
セッティングの暗黙の変換を撤廃する。.value
と Def.setting
へと移行してほしい。
SubProcess
の apply
オーバーロードを撤廃する。SubProcess(ForkOptions(runJVMOptions = ..))
へと移行する。
toError(opt: Option[String]): Unit
を廃止する (opt foreach sys.error
と同様)。ScalaRun#run
と併用する場合、scalaRun.run(...).failed foreach (sys error _.getMessage)
というように書き換える。
build.sbt
の静的バリデーション。(詳細は以下の項目)
^
と ^^
コマンドの移植。on projects that adopts Scalafmt
scalas
を使ったときの、スタートアップのログレベルを -error
まで落とした。 #840 by @eed3si9n
++
の振る舞いが変更され、Scala バージョンのサポートを予め列挙するサブプロジェクトのみが変更されるようになった。しかし、!
を追加することで全てのプロジェクトを変更することもできる。どのプロジェクトが変更されたのかの詳細な情報を表示するための、-v
オプションも追加された。#2613 by @jroper
ivyLoggingLevel
を UpdateLogging.Quiet
に落とすようにした。 @eed3si9n
build.sbt
(*.sbt
) ファイル名をログに表示するようにした。 #1911 by @valydia
build.sbt
ファイルから aggregate
を呼べるようにした。 By [@xuwei-k][@xuwei-k]
inspect tree
などで表示される ASCII グラフの最大幅を決める asciiGraphWidth
という新しいグローバルセッティングを追加した。デフォルトでは、40文字。By @RomanIakovlev.
autoImport
の検知に Java リフレクションを使うようにした。 #3115 by @jvican
InteractionService
を追加した。 #3182 by @eed3si9n
PollingWatchService
と Java NIO を抽象化する新しい WatchService
を追加した。 io#47 by @Duhemm on behalf of The Scala Center.
IO.copyFile
と IO.copyDirectory
に sbt.io.CopyOptions()
を受け取るバリエーションを追加した。(詳細は以下の項目)
Path.directory
と Path.contentOf
を sbt-native-packager から寄付してもらった。 io#38 by @muuki88
(Lightbend の委託で) Grzegorz Kossakowski が Zinc 1 にもたらした大きな改善として、クラスベースの name hashing がある。これは、大規模な Scala プロジェクトにおいて差分コンパイルが高速化することが見込まれる。
Zinc 1 の name hashing は、コード間の依存性をファイルではなく、クラスのレベルで追跡する。GitHub issue sbt/sbt#1104 に有名なプロジェクトの既存のクラスにメソッドを追加した場合の比較データがある:
ScalaTest AndHaveWord class: Before 49s, After 4s (12x)
Specs2 OptionResultMatcher class: Before 48s, After 1s (48x)
scala/scala Platform class: Before 59s, After 15s (3.9x)
scala/scala MatchCodeGen class: Before 48s, After 17s (2.8x)
これは、クラスがどのようにまとめられているかといった様々な要素に依存するが、3x ~ 40x の向上が見られるのが分かる。高速化の理由は、クラスをソースファイルという「くくり」から分けたことで少ない数のソースファイルをコンパイルしているからだ。scala/scala の Platform クラスにメソッドを追加した例だと、sbt 0.13 の name hashing は 72 のソースをコンパイルしていたのに対し、新しい Zinc は 6 のソースをコンパイルしている。
xsbti.compile
パッケージ以下の IncOptions
などの Java クラスはコンストラクタを隠蔽する。ファクトリーメソッドである xsbti.compile.Foo.of(...)
に移行する。
ivyScala: IvyScala
キーは scalaModuleInfo: ScalaModuleInfo
に名前が変わる。
xsbti.Reporter#log(...)
は xsbti.Problem
をパラメータとして受け取るようになった。log(problem.position, problem.message, problem.severity)
と呼び出すことで以前の log(...)
に委譲できる。
xsbi.Maybe
、xsbti.F0
、sxbti.F1
は対応する Java 8 クラスである java.util.Optional
、java.util.Supplier
、および java.util.Function
に変更する。
sbt 1.0 はサーバ機能を含み、IDE や他のツールは JSON API を用いてビルドのセッティングをクエリしたり、コマンドを呼び出すことができる。sbt 0.13 においてインタラクティブ・シェルが shell
コマンドによって実装されていたのと同様に、「サーバ」も shell
コマンドによって実装されていて、人間とネットワークの両方の入力を受け取るようになっている。ユーザ視点で見ると、サーバが加わったことによる影響はほとんど無いはずだ。
2016年3月に「サーバ」機能が最小限になるようにリブートが行われた。JetBrain社で IntelliJ の sbt インターフェイスを担当する @jastice とコラボして機能のリストを絞っていった。sbt 1.0 の段階では当初欲しかった機能の全ては入っていないが、長期的に IDE と sbt エコシステムの連携が向上する布石になることを目指している。例えば、IDE 側から compile タスクを命令して、コンパイラ警告を JSON イベントして受け取るといったことができる:
{"type":"xsbti.Problem","message":{"category":"","severity":"Warn","message":"a pure expression does nothing in statement position; you may be omitting necessary parentheses","position":{"line":2,"lineContent":" 1","offset":29,"pointer":2,"pointerSpace":" ","sourcePath":"/tmp/hello/Hello.scala","sourceFile":"file:/tmp/hello/Hello.scala"}},"level":"warn"}
関連して追加された機能として、テスト中にバックグラウンドで web サーバなどを実行するのに使える bgRun
タスクがある。
sbt 1.0 は、Log4J 2 と sjson-new を用いて実装したイベント・ロギングを導入する。 普通の String ベースのログの他に、logger に対して case clase や Contraband によって生成された疑似 case class を渡すことができる:
def registerStringCodec[A: ShowLines: TypeTag]: Unit = ...
final def debugEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Debug, event)
final def infoEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Info, event)
final def warnEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Warn, event)
final def errorEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Error, event)
[success]
メッセージといった様々なイベントは、内部でイベント・ロギングを用いて送信されている。
この機構をサーバと併用することで、プラグインやコンパイラから JSON イベントを発行することができる。
また、Log4J 2 を内部に採用したことで SLF4J のバインディングを提供するようになった。
sbt 1.0 は、タスク内において if 式の本文や匿名関数内からの .value
の呼び出しを禁止する。@sbtUnchecked
アノテーションを使ってこのチェックを無効化できる。
他に、静的バリデーションは、タスクの本文内から .value
を呼び忘れるのも予防する。
sbt 1.0 は eviction 警告の表示を改善する。
ビフォー:
[warn] There may be incompatibilities among your library dependencies.
[warn] Here are some of the libraries that were evicted:
[warn] * com.google.code.findbugs:jsr305:2.0.1 -> 3.0.0
[warn] Run 'evicted' to see detailed eviction warnings
アフター:
[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[warn]
[warn] * com.typesafe.akka:akka-actor_2.12:2.5.0 is selected over 2.4.17
[warn] +- de.heikoseeberger:akka-log4j_2.12:1.4.0 (depends on 2.5.0)
[warn] +- com.typesafe.akka:akka-parsing_2.12:10.0.6 (depends on 2.4.17)
[warn] +- com.typesafe.akka:akka-stream_2.12:2.4.17 () (depends on 2.4.17)
[warn]
[warn] Run 'evicted' to see detailed eviction warnings
@jrudolph の sbt-cross-building はプラグイン作者のためのプラグインだ。
^
(クロス) コマンドと ^^
(sbtVersion スイッチ) コマンドを追加して、これは +
を ++
を sbt のメジャーバージョン間の切り替えに対応させたものだと考えることができる。
プラグインを sbt 1.0 に対応させるのに便利なので、sbt 0.13.16 においてこれらのコマンドを sbt 本体にマージした。
シェルから sbtVersion in pluginCrossBuild
をスイッチするには以下を実行する:
^^ 1.0.0
これで sbt 1.0.0 (とその Scala バージョンである 2.12) を使うようになる。
sbt バージョンに特定のコードを含む必要があれば、src/main/scala-sbt-0.13
、src/main/scala-sbt-1.0
などバイナリ sbt バージョンを末尾に追加したディレクトリを作る。
複数の sbt バージョンをまたいでコマンドを実行するには、まず:
crossSbtVersions := Vector("0.13.16", "1.0.0")
と設定して、以下を実行する:
^ compile
#3133 by @eed3si9n (forward ported from 0.13.16-M1)
sbt IO 1.0 は IO.copyFile
と IO.copyDirectory
のバリエーションとして sbt.io.CopyOptions()
を受け取るものを追加する。
CopyOptions()
は疑似 case class の一例で、ビルダーパターンに似ている。
import sbt.io.{ IO, CopyOptions }
IO.copyDirectory(source, target)
// The above is same as the following
IO.copyDirectory(source, target, CopyOptions()
.withOverwrite(false)
.withPreserveLastModified(true)
.withPreserveExecutable(true))
sbt 1.0 は Lightbend社の Eugene Yokota (@eed3si9n) と Scala Center の Martin Duhem (@Duhemm) 共著で書かれた Library management API を追加する。 この API は Apache Ivy および cached resolution や Coursier といったその他の代替依存性解決エンジンを抽象化することを目指している。
Ivy エンジンのためのアーティファクトの並列ダウンロードは Scala Center の Jorge (@jvican) によってコントリビュートされた。 また、これは Gigahorse OkHttp を Network API として導入し、内部で Square OkHttp をアーティファクトのダウンロードにも用いる。
lm#124 by @eed3si9n/@Duhemm, lm#90 by @jvican/@jsuereth and lm#104 by @eed3si9n.
Zinc の内部構造の保存方法として Google Protocol Buffer を用いたバイナリ形式が Scala Center の Jorge (@jvican) によってコントリビュートされた。この新形式は主に 3つの利点がある:
ライブラリ依存性のロッキング機能はまだ実装途中だが、Scala Center の Jorge (@jvican) は関連する機能を追加して、最終的にロッキングが可能となる予定だ。
感謝しなければいけない人が多すぎでここにおさまらなった。Credits を参照してほしい。