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:
- A full suite of ClojureScript-related tasks supporting interactive development
- A Chestnut-inspired example Cljs/Om project by Juho Teperi
- cljx, also by Juho Teperi, for building projects with mixed Clojure and ClojureScript sources
- boot-garden by Martin Klepsch, for compiling Garden stylesheets
- boot-jruby by Toby Crawley for running JRuby and Ruby gems
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
commit! operations, just like
git. Adding to a Fileset returns a new Fileset, and is efficient
because, like git, we use
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!