Boot 2.0 RC1: Stable API, Immutable Filesets, Growing Community

Yesterday we released Boot 2.0 RC1 (Release Candidate 1), the newest version of Clojure's most exciting build tool. With this release, the Boot API is now stable, and task authors can be confident tasks written against RC1 will work through future 2.0.x series releases. We also think Boot now meets or exceeds the requirements of most Clojure and ClojureScript projects, and we encourage you to try it out. We've been using Boot here at Adzerk for a variety of projects with great success.

While Boot is distributed as an executable and certainly qualifies as a build tool in the traditional sense, we like to think of Boot more as "build tooling" - it is a set of abstractions and libraries designed to be extended.

More Community Tasks

Over the past three months leading to this release we distributed 28 prerelease versions of Boot and collected great feedback from our small but enthusiastic community. Thanks to that community, and owing to the extensibility of Boot, our Community Tasks list is growing apace. Boot now sports many tasks, all of which can be composed and run on a single Java Virtual Machine (JVM), including:


An important technical question we answered for ourselves with this release was: what value should we thread through a build pipeline? Boot builds consist of a set of tasks composed functionally like Ring middleware or Transducers. Until RC1, the value we threaded through tasks was a unique but meaningless value which represented only the intent to build something. All of the actual work on the filesystem happened implicitly and outside of the pipeline through Boot's temporary file management APIs.

This approach had a couple problems. First, it just didn't feel right. Second, because the file system was implicit and global, tasks couldn't retain references to the filesystem the build was operating on, or otherwise work with the filesystem at a value level.

Clojure leverage is at its highest when one is working with values, particularly immutable ones, so without a practical, immutable filesystem value, tasks couldn't realize fully the benefits of being written in Clojure.

We solved these problems and answered our own question with a type we call Fileset. A Fileset value is created and passed to a task or task pipeline when a build is initiated as of RC1.

Filesets are immutable values that represent the state of a filesystem at a point in time. They take inspiration from git, and are like little anonymous git repositories you can work with in Clojure as values. Filesets support add and commit! operations, just like git. Adding to a Fileset returns a new Fileset, and is efficient because, like git, we use content-based addressing. Comitting to a Fileset persists the Fileset's structure and content to disk. Filesets can also be easily diff-ed which makes it easy for tasks to cache intermediate files. Juho Teperi's cljx task leverages fileset diff-ing to great effect.

Documentation and Branding

Maybe the most important improvements to Boot in the past few months have not been code, but documentation and branding. The Boot Wiki now explains every major architectural idea in Boot at a high level, while also covering details like public API surface, JVM settings, and editor/IDE integrations. Thanks to our sponsorship by Adzerk, we also have a cute new mascot and landing site by Joshua Smith that showcases Boot technology while also being adorable.

Windows, 2.0, and Beyond

With RC1, Boot has entered a new era of stability and usability, but our quest to build the finest Clojure build tool is far from complete. In particular, Windows support could use a lot of work.

Getting better for Windows users, and getting better for everyone, will take continued community growth, support, and involvement. To that end, I encourage you to try Boot and get involved in our community.

We look forward to helping you and collecting your feedback, bug reports, and pull requests!