CLPM Bundles
This file describes the "bundle" capabilities of CLPM. Bundles are anonymous, project specific contexts that can be included in source repositories.
Bundles are meant to ease the problems of creating repeatable development, deployment, and testing environments. While ASDF does not allow developers to specify upper bounds on dependency versions (only lower bounds) [1], CLPM's bundle capability allows exactly that, in addition to specifying that some dependency should be satisfied by some unreleased version directly from source control (great for developing projects in multiple repos simultaneously!).
A CLPM bundle is a collection of systems locked at specific versions. A
bundle is fully defined by a clpmfile.lock
file, which is itself
created from a clpmfile
file. Once a lock file is generated, the
bundle commands allow you to perform tasks such as running Lisp
processes that can load systems in the bundle with zero configuration or
helpers needed (other than ASDF, of course).
Files
clpmfile
A clpmfile
describes what projects or systems a user wants to place in
a bundle and any constraints she has on the versions of those objects.
It is a file, typically located at the root of a source code repository,
that consists of a series of directives where each directive is a list
starting with a keyword. The directives are described below.
Additionally, the first directive in the file must be the :api-version
directive. This document describes version "0.4".
:api-version
This directive must be the first to appear in the file. It consists of one argument that must be a string naming the clpmfile version the rest of the file is described in. Example:
(:api-version "0.4")
:source
All source directives must come immediately after the api-version directive. This tells CLPM which sources it is allowed to search for dependencies in. The first argument to this directive is the name of the source as a string. The remainder is a plist describing the source. For example, to use the primary quicklisp distribution, you can write:
(:source "quicklisp"
:type :quicklisp
:url "https://beta.quicklisp.org/dist/quicklisp.txt")
:project
The project directive declares a dependency on an entire project.
(name &key vcs systems source version)
name
must be a string, naming the project.
:source
If provided, names a source that the system must be located in.
:vcs
If provided, must be a plist naming the :branch
, :commit
, or :tag
to use when checking out the project from version control.
:systems
If provided, must be a list of strings naming the systems to be required
in the bundle. Otherwise all systems are required.
:version
If provided, must be a version specifier. Can either be a string (in
which case it is parsed as if by clpm install
), a single version
specifier (such as (= "1.2")
), or a list of version specifiers (such
as ((>= "1.1") (< "2"))
).
:system
The system directive declares a dependency on a specific system.
(name &key source version)
name
must be a string, naming a system provided by one of the specified
sources.
:source
If provided, names a source that the system must be located in.
:version
If provided, must be a version specifier. Can either be a string (in
which case it is parsed as if by clpm install
), a single version
specifier (such as (= "1.2")
), or a list of version specifiers (such
as ((>= "1.1") (< "2"))
).
:git
The git directive specifies a requirement that must be satisfied by a git repository hosted at an arbitrary location. Unless specified otherwise, every explicitly defined system (and their dependencies) are included in the bundle.
(name &key url branch commit tag systems)
name
must be a string, unique in the file.
:url
must be a string, the url of the repository.
:branch
If specified, must be a string naming the branch to use. If none of
branch, commit, or tag are specified, the branch defaults to the default
branch from the server.
:commit
If specified, must be a string naming the commit to use.
:tag
If specified, must be a string naming the tag to use.
:systems
A list naming the systems to require in the bundle. If NIL, all systems
are required.
:github
The github directive specifies a requirement that must be satisfied by a git repository hosted on a github server. Unless specified otherwise, every explicitly defined system (and their dependencies) are included in the bundle.
(name &key (host "github.com") path branch commit tag systems)
name
must be a string, unique in the file.
:host
is the hostname of the github server. Defaults to github.com.
:path
is a string naming the path to the repository.
:branch
If specified, must be a string naming the branch to use. If none of
branch, commit, or tag are specified, the branch defaults to the default
branch from the server.
:commit
If specified, must be a string naming the commit to use.
:tag
If specified, must be a string naming the tag to use.
:systems
A list naming the systems to require in the bundle. If NIL, all systems
are required.
:gitlab
The gitlab directive specifies a requirement that must be satisfied by a git repository hosted on a gitlab server. Unless specified otherwise, every explicitly defined system (and their dependencies) are included in the bundle.
(name &key (host "gitlab.com") path branch commit tag systems)
name
must be a string, unique in the file.
:host
is the hostname of the gitlab server. Defaults to gitlab.com.
:path
is a string naming the path to the repository.
:branch
If specified, must be a string naming the branch to use. If none of
branch, commit, or tag are specified, the branch defaults to the default
branch from the server.
:commit
If specified, must be a string naming the commit to use.
:tag
If specified, must be a string naming the tag to use.
:systems
A list naming the systems to require in the bundle. If NIL, all
explicitly defined systems are required.
:asd
This directive states that the specified asd file should be included in the bundle. The arguments it accepts are:
(asd-path &key systems)
asd-path
Must be a string providing the path to the asd file, relative to the
clpmfile.
systems
What systems defined by the ASD file should be included. Must be a list
of strings. If NIL, then all systems explicitly defined in the asd file
are required and have their dependencies satisfied.
clpmfile.lock
The lock file defines all releases included in the bundle. This consists of every top level requirement specified in the clpmfile and their dependencies. When the dependencies are resolved, any system fetched from source control is assumed to satisfy any requirements placed on it. No formal commitment to syntax for this file is guaranteed yet.
Configuration
Every bundle command reads the file .clpm/bundle.conf
(if it exists,
relative to the clpmfile
) and merges the configuration defined in that
file into CLPM's central config. Currently, all configuration sections
are merged, in a future version a whitelist of configuration options
will be defined.
Commands
clpm bundle install
If the lock file does not exist, create it and then ensure all releases are installed. If the lock file exists, load it and ensure that all releases included in the bundle are installed locally.
clpm bundle exec
Execute the specified command (following exec
) where environment
variables are set such that ASDF will have access to all systems
included in the bundle with no extra configuration. Requires the lock
file to exist.
All environment variables are present in the new process, additionally the following environment variables are set:
ASDF_OUTPUT_TRANSLATIONS
If CLPM is configured to manage the output translations for bundles. See
:output-translations
in the (:bundle)
config table.
CL_SOURCE_REGISTRY
Set to contain the parent folders of every .asd file in the bundle.
clpm bundle update
Update the lock file to point to the latest versions available that
satisfy the constraints in the clpmfile
.
Footnotes
[1] https://bugs.launchpad.net/asdf/+bug/1183179