sbt 1.4.0-RC2
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.4.0-RC2. This is the fourth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series.
- If no serious issues are found by Saturday, October 3rd 2020, 1.4.0-RC2 will become 1.4.0 final.
If no serious issues are found by Saturday, September 19th 2020, 1.4.0-RC1 will become 1.4.0 final.
The headline features of sbt 1.4.0 are:
- build server protocol (BSP) support
- sbtn: a native thin client for sbt
- build caching
ThisBuild / versionScheme
to take the guessing out of eviction warning
How to upgrade
You can upgrade to sbt 1.4.0-RC2 by putting the following in project/build.properties
:
sbt.version=1.4.0-RC2
Changes since RC1
- BSP
buildTarget/run
andbuildTarget/test
support #5865/#5878 by @adpi2 - sbt-dependency-graph is brought into sbt 1.4.0
- Updates to lm-coursier-shaded 2.0.0-RC6-9, which uses Coursier 2.0.0-RC6-26
- Adds retry with backoff during publish (
-Dsbt.repository.publish.attempts
set to 3) lm#340 by @izharahmd - Fixes shell prompt override #5839 by @eatkins
- Fixes in various terminal IO issues by @eatkins
- Fixes in Zinc by @dwijnand, @eatkins, and @eed3si9n addressing over-compilation regressions.
Build server protocol (BSP) support
sbt 1.4.0 adds build server protocol (BSP) support, contributed by Scala Center. Main implementation was done by Adrien Piquerez (@adpi2) based on @eed3si9n’s prototype.
When sbt 1.4.0 starts, it will create a file named .bsp/sbt.json
containing a machine-readable instruction on how to run sbt -bsp
, which is a command line program that uses standard input and output to communicate to sbt server using build server protocol.
How to import to IntelliJ using BSP
- Start sbt in a terminal
- Open IntelliJ IDEA 2020.1.2 or later
- Select “Open or import”, and select “BSP Project”
How to import to VS Code + Metals
- Delete existing
.bsp
directory if any - Open VS Code in the working directory
- Ignore the prompt to import the project
- Start
sbt -Dsbt.semanticdb=true
in the Terminal tab. Wait till it displays “sbt server started” - Navigate to Metals view, and select “Connect to build server”
- Type
compile
into the sbt session to generate SemanticDB files
Native thin client
sbt 1.4.0 adds an official native thin client called sbtn
that supports all tasks. https://github.com/sbt/sbtn-dist/releases/tag/v1.4.0-RC2
This lets you run sbt tasks from the system shell as:
$ sbtn compile
$ sbtn shutdown
The native thin client will run sbt (server) as a daemon, which avoids the JVM spinup and loading time for the second call onwards. This could an option if you would like to use sbt from the system shell such as Zsh and Fish.
Remember to call sbtn shutdown
when you’re done!
Later on, sbt
script will also support --client
option to run the native thin client:
$ sbt --client compile
$ sbt --client shutdown
ThisBuild / versionScheme
sbt 1.4.0 adds a new setting called ThisBuild / versionScheme
to track version scheme of the build:
ThisBuild / versionScheme := Some("early-semver")
The supported values are "early-semver"
, "pvp"
, and "semver-spec"
. sbt will include this information into pom.xml
and ivy.xml
as a property. In addition, sbt 1.4.0 will use the information to take the guessing out of eviction warning when this information is available. #5724 by @eed3si9n
VirtualFile + RemoteCache
sbt 1.4.0 / Zinc 1.4.0 virtualizes the file paths tracked during incremental compilation. The benefit for this that the state of incremental compilation can shared across different machines, as long as ThisBuild / rootPaths
are enumerated beforehand.
To demonstrate this, we’ve also added experimental cached compilation feature to sbt. All you need is the following setting:
ThisBuild / pushRemoteCacheTo := Some(MavenCache("local-cache", file("/tmp/remote-cache")))
Then from machine 1, call pushRemoteCache
. This will publish the *.class
and Zinc Analysis artifacts to the location. Next, from machine 2, call pullRemoteCache
.
Build linting
On start up, sbt 1.4.0 checks for unused settings/tasks. Because most settings are on the intermediary to other settings/tasks, they are included into the linting by default. The notable exceptions are settings used exclusively by a command. To opt-out, you can either append it to Global / excludeLintKeys
or set the rank to invisible.
Conditional task
sbt 1.4.0 adds support for conditional task (or Selective task), which is a new kind of task automatically created when Def.task { ... }
consists of an if
-expression:
bar := {
if (number.value < 0) negAction.value
else if (number.value == 0) zeroAction.value
else posAction.value
}
Unlike the regular (Applicative) task composition, conditional tasks delays the evaluation of then-clause and else-clause as naturally expected of an if
-expression. This is already possible with Def.taskDyn { ... }
, but unlike dynamic tasks, conditional task works with inspect
command. See Selective functor for sbt for more details. #5558 by @eed3si9n
Incremental build pipelining
sbt 1.4.0 adds experimental incremental build pipelining. To enable build pipelining for the build:
ThisBuild / usePipelining := true
To opt-out of creating an early output for some of the subprojects:
exportPipelining := false
sbt-dependency-graph is in-sourced
sbt 1.4.0 brings in Johannes Rudolph’s sbt-dependency-graph plugin into the code base. Since it injects many tasks per subprojects, the plugin is split into two parts:
MiniDependencyTreePlugin
that is enabled by default, bringing independencyTree
task toCompile
andTest
configurations- Full strength
DependencyTreePlugin
that is enabled by putting the following toproject/plugins.sbt
:
addDependencyTreePlugin
Fixes with compatibility implications
- Replaces Apache Log4j with our own logger by default to avoid Appender leakage. Use
ThisBuild / useLog4J := true
to use Log4j. #5731 by @eatkins - Makes JAR file creation repeatable by sorting entry by name and dropping timestamps #5344/io#279 by @raboof
- Loads bare settings in the alphabetic order of the build files #2697/#5447 by @eed3si9n
- Loads
val
s from top-to-bottom within a build file #2232/#5448 by @eed3si9n - HTTP resolvers require explicit opt-in using
.withAllowInsecureProtocol(true)
#5593 by @eed3si9n - Ctrl-C during triggered execution
~
returns to the shell instead of shutting down sbt #5804 by @eatkins
Other updates
- Updates shell to use JLine 3 for better tab completion #5671 by @eatkins
- Adds support for Scala 2.13-3.0 sandwich #5767 by @eed3si9n
- Throws an error if you run sbt from
/
without-Dsbt.rootdir=true
#5112 by @eed3si9n - Upates
StateTransform
to acceptState => State
#5260 by @eatkins - Fixes various issues around background run #5259 by @eatkins
- Turns off supershell when
TERM
is set to “dumb” #5278 by @hvesalai - Avoids using system temporary directories for logging #5289 by @eatkins
- Adds library endpoint for
sbt.ForkMain
#5315 by @olafurpg - Avoids using last modified time of directories to invalidate
doc
#5362 by @eatkins - Fixes the default artifact of packageSrc for custom configuration #5403 by @eed3si9n
- Fixes task cancellation handling #5446/zinc#742 by @azolotko
- Adds
toTaskable
method injection toInitialize[A]
for tuple syntax #5439 by @dwijnand - Fixes the error message for an undefined setting #5469 by @nigredo-tori
- Updates
semanticdbVersion
to 4.3.7 #5481 by @anilkumarmyla - Adds
Tracked.outputChangedW
andTracked.inputChangedW
which requires typeclass evidence ofJsonWriter[A]
instead ofJsonFormat[A]
#5513 by @bjaglin - Fixes various supershell interferences #5319 by @eatkins
- Adds extension methods to
State
to faciliate sbt server communication #5207 by @eed3si9n - Adds support for weighed tags for
testGrouping
#5527 by @frosforever - Updates to sjson-new, which shades Jawn 1.0.0 #5595 by @eed3si9n
- Fixes NullPointerError when credential realm is
null
#5526 by @3rwww1 - Adds
Def.promise
for long-running tasks to communicate to another task #5552 by @eed3si9n - Uses Java’s timestamp on JDK 10+ as opposed to using native call io#274 by @slandelle
- Adds retry with backoff during publish (
-Dsbt.repository.publish.attempts
set to 3) lm#340 by @izharahmd - Improves failure message for PUT lm#309 by @swaldman
- Adds provenance to AnalyzedClass zinc#786 by @dwijnand + @mspnf
- Makes hashing childrenOfSealedClass stable zinc#788 by @dwijnand
- Fixes performance regressions around build source monitoring #5530 by @eatkins
- Fixes performance regressions around super shell #5531 by @eatkins
- Various performance improvements in Zinc zinc#756/zinc#763 by @retronym
- Adds a monitor to warn about excessive GC #5812 by @eatkins
- Fixes forked tests running tests twice when they match multiple fingerprints #5800 by @Duhemm
Participation
sbt 1.4.0-RC1 was brought to you by 29 contributors. Eugene Yokota (eed3si9n), Ethan Atkins, Dale Wijnand, Adrien Piquerez, Jason Zaugg, Arnout Engelen, Josh Soref, Guillaume Martres, Anil Kumar Myla, Brice Jaglin, Maksim Ochenashko, João Ferreira, Steve Waldman, frosforever, Alex Zolotko, Heikki Vesalainen, Ismael Juma, Stephane Landelle, Jannik Theiß, João Ferreira, lloydmeta, Alexandre Archambault, Erwan Queffelec, Izhar Ahmed, Kenji Yoshida (xuwei-k), Olafur Pall Geirsson, Renato Cavalcanti, Vincent PERICART, nigredo-tori. Thanks!
Thanks to everyone who’s helped improve sbt and Zinc 1 by using them, reporting bugs, improving our documentation, porting builds, porting plugins, and submitting and reviewing pull requests.
For anyone interested in helping sbt, there are many avenues for you to help, depending on your interest. If you’re interested, Contributing, “help wanted”, “good first issue” are good starting points.
Appendix
To test sbt server manually, make sure to have an sbt session running, and start sbt -bsp
in another termnial. And paste the following in:
{ "jsonrpc": "2.0", "id": 1, "method": "build/initialize", "params": { "displayName": "foo", "version": "1.0.0", "bspVersion": "2.0.0-M5", "rootUri": "file:///tmp/hello", "capabilities": { "languageIds": ["scala"] } } }
Then enter \r\n
(type Enter
, Ctrl-J
for zsh). This should return:
Content-Length: 200
Content-Type: application/vscode-jsonrpc; charset=utf-8
{"jsonrpc":"2.0","id":1,"result":{"displayName":"sbt","version":"1.4.0-SNAPSHOT","bspVersion":"2.0.0-M5","capabilities":{"compileProvider":{"languageIds":["scala"]},"dependencySourcesProvider":true}}}