sbt 1.0.0-RC3 and sbt 0.13.16

By Eugene Yokota (@eed3si9n) July 28, 2017

I hope you’re having a wonderful summer. Here’s an update of what we’ve been up to.

Try sbt 1.0.0-RC3

sbt team is happy to announce the availability of sbt 1.0.0-RC3. Here are some of the changes since beta 2:

  • Library management API has been implemented to abstract dependency resolution engines such as Apache Ivy, cached resolution, and Coursier. This was co-authored by Eugene at Lightbend and Martin Duhem (@mnduhem) at Scala Center.
  • A binary format was added for Zinc’s internal storage using Google Protocol Buffer. This was contributed by Jorge (@jvican) at Scala Center.
  • Lots of regression fixes by Dale (@dwijnand) and Eugene, especially since RC-2.

For full list of sbt 1.0 features, please check out the release note.

sbt 1.0 release candidates are binary compatible with the final sbt 1.0. This allows us to start rebuilding the plugin ecosystem, as we catch early bugs. If no serious issues are found by Friday, August 11th 2017, 1.0.0-RC3 will become 1.0.0 final.

Use sbt 0.13.16 to start cross building sbt 1.0 plugins

We are also releasing sbt 0.13.16 which is capable of cross building sbt 1.0 plugins while staying on sbt 0.13.

sbt 0.13.16 incorporates sbt-cross-building plugin originally written by Johannes Rudolph from Lightbend. It adds cross command ^ and sbtVersion switch command ^^, similar to + and ++, but for switching between multiple sbt versions across major versions. Now, all you have to type is:

> ^^ 1.0.0-RC3

Your plugin will now build with sbt 1.0.0-RC3 (and its Scala version 2.12.2). Please help us rebuild the plugin ecosystem. If you port a plugin, be sure to send a pull request to sbt/website.

Event logging

One of the features introduced in sbt 1.0 is event logging implemented using Log4J 2 and sjson-new. In addition to the regular String-based logging, you can now send case classes and Contraband-generated pseudo case classes to the logger:

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)

Various events such as [success] message are sent internally via event logging. We are hoping that this mechanism can be used in conjunction with server so plugins and compilers can publish JSON events. Since the logger uses Log4J 2 internally, we now provide SLF4J binding.