-
-
Notifications
You must be signed in to change notification settings - Fork 180
Configuring Boot
It is useful to distinguish two sets of orthogonal concerns while talking about Boot configuration: configuring Boot itself vs configuring your Clojure project (that Boot is going to instrument).
tl;dr Boot itself is configured with environment variables, while your Clojure project is configured with build.boot.
Configuring Boot means controlling the JVM environment before
your project is loaded. Configuring your Clojure project means declaring
dependencies, specifying which tasks to run, etc. Environment variables and
boot.properties
are used in the first case, profile.boot
and build.boot
in the latter.
Configuring the Java environment that bootstraps Clojure is done via
environment variables, JVM system properties, and/or properties files.
Boot being a self-documented toolchain, you can query the environment
variables and properties files that Boot understands by invoking boot -h
on the command line.
Some interesting environment variables / system properties:
-
BOOT_AS_ROOT
Set to 'yes' to allow boot to run as root. -
BOOT_CLOJURE_VERSION
The version of Clojure boot will provide (1.8.0). -
BOOT_CLOJURE_NAME
The Maven identifier to use instead oforg.clojure/clojure
. -
BOOT_HOME
Directory where boot stores global state (~/.boot). -
BOOT_FILE
Build script name (build.boot). -
BOOT_JVM_OPTIONS
Specify JVM options. (*note) -
BOOT_LOCAL_REPO
The local Maven repo path (~/.m2/repository). -
BOOT_VERSION
Specify the version of boot core to use. -
BOOT_COLOR
Turn colorized output on or off
And the properties files:
-
BOOT_HOME/boot.properties
The global configuration file. -
./boot.properties
The local project configuration.
And a .bootignore
file:
-
./.bootignore
Analogous to .gitignore
The environment is configured with the following precedence, from highest to lowest:
- system properties
- environment variables
-
./boot.properties
file -
BOOT_HOME/boot.properties
file
For example, if you set BOOT_COLOR
in the JVM system properties it
will override settings in environment variables and properties files.
A special case that belongs in our Boot configuration chapter is when you want to pin your project to a specific Boot version. This is covered in depth here, but in a nutshell (in the project directory):
$ boot -V > boot.properties
On the other hand, if you want to force a Boot version globally, you can
edit the BOOT_HOME/boot.properties
file:
cat ~/.boot/boot.properties
#http://boot-clj.com
#Wed Jul 13 12:54:08 PDT 2016
BOOT_CLOJURE_NAME=org.clojure/clojure
BOOT_CLOJURE_VERSION=1.8.0
BOOT_VERSION=2.6.0
For example, you might want to downgrade BOOT_VERSION
, or you might want
to upgrade BOOT_CLOJURE_VERSION
to a release candidate. Boot will look
for those global settings in ~/.boot/boot.properties
.
Alternatively, You could set an environment variable in your ~/.bashrc
file:
export BOOT_CLOJURE_VERSION=1.9.0-alpha10
As described above, environment variables override settings in
boot.properties
files.
The earliest version of Clojure supported by Boot is 1.6.0.
.bootignore
controls construction of the initial boot-fileset. Files matching the regexes in .bootignore
will be excluded. For example, to ignore emacs backup files, .bootignore should contain .*~$
. To ignore transient emacs files, add ^\.#
and /\.#
.
The comment character is #
. The file should go in the project root directory.
Boot uses pretty to print exceptions and stack traces. As of Boot 2.7.0, pretty prints stack traces "upside down". That is, the root exception appears at the top of the stack trace instead of at the bottom. To restore the old stack frame printing order, you can add this to your $BOOT_HOME/.profile.boot
(normally ~/.boot/profile.boot
):
(alter-var-root
#'boot.from.io.aviso.exception/*traditional*
(constantly true))
Boot 2.7.0 offers finer-grained control of the formatting and coloring of exceptions. For example, to print exception messages in a normal font instead of italics, you could add this to your ~/.boot/profile.boot
:
(alter-var-root
#'boot.from.io.aviso.exception/*fonts*
assoc :message boot.from.io.aviso.ansi/white-font)
With Boot versions 2.8.0+ those fields are also read from boot.properties
files. In older versions you need to specify them as system enviroment variables (e.g. export BOOT_JVM_OPTIONS=-client
).
Many existing CI services (CircleCI for example), have limits on the amount of memory available to projects. In some cases, Boot may exceed these limits and/or be automatically terminated, especially when fetching dependencies.
To avoid this issue, first check with your provider as to memory limits,
and then provide BOOT_JVM_OPTIONS
to suit. For example, CircleCI has a
limit of 4 gigabytes—to configure Boot to not exceed that limit, set a
conservative limit like so:
BOOT_JVM_OPTIONS="-Xmx2g"
The profile.boot
and build.boot
scripts are programs that configure
your Clojure project. They impact the program that runs once clojure is
bootstrapped.
They are evaluated in the following order:
BOOT_HOME/profile.boot
./profile.boot
./build.boot
They are evaluated in the same namespace and environment, so things you
define in say BOOT_HOME/profile.boot
are visible to expressions in
./profile.boot
and ./build.boot
, for example. Expressions that are
evaluated later can override, redef, etc. anything done in scripts that
were evaluated earlier.
The project-local profile.boot
script can be useful when you have
project-specific configuration that you don't want to keep in version
control. Credentials, configuration
that is not shared with the team, etc.
This can be used to modify how boot works at the lowest levels, in every
pod. For example, we could change the default repositories that boot
uses to load itself during bootstrapping by creating a boot-shim.clj
file either in the BOOT_HOME
or the current working directory with the
following contents:
(try (require 'boot.aether)
(eval '(reset! boot.aether/default-repositories
[["public" {:url "http://repo.local/public/"}]
["private" {:url "http://repo.local/private/"}]]))
(catch Throwable _))
This file will be evaluated via clojure.core/load-file in each Clojure runtime that's created (all pods, including the main one in which the build.boot runs). Clojure core will be available but no boot-related code will have been loaded or run yet.
So you can use it to patch clojure core if you want or basically override
anything in clojure or boot by doing alter-var-root
, etc.
You can find other developers and users in the #hoplon
channel on freenode IRC or the boot slack channel.
If you have questions or need help, please visit the Discourse site.
- Environments
- Boot environment
- Java environment
- Tasks
- Built-ins
- Third-party
- Tasks Options
- Filesets
- Target Directory
- Pods
- Boot Exceptions
- Configuring Boot
- Updating Boot
- Setting Clojure version
- JVM Options
- S3 Repositories
- Scripts
- Task Writer's Guide
- Require inside Tasks
- Boot for Leiningen Users
- Boot in Leiningen Projects
- Repl reloading
- Repository Credentials and Deploying
- Snippets
- Troubleshooting
- FAQ
- API docs
- Core
- Pod
- Util