Table of Contents
stift
stift is a package manager for Common Lisp, after Go's modules. A project
names the git repositories it requires in its stiftfile, each pinned to a
commit. stift fetches them into a cache of its own, sets ASDF up to find
exactly them, and runs Lisps and test suites with them. There is no
registry and no mirror: every project comes from its own repository. stift
needs only ASDF, UIOP and git.
cd hello # a git repository with hello.asd
stift init example.org/me/hello
stift get https://gitlab.common-lisp.net/alexandria/alexandria.git
stift exec sbcl --non-interactive --eval '(asdf:load-system "hello")'
stift test --lisp sbcl --lisp ccl
;;; -*- mode: lisp-data -*-
(:project "example.org/me/hello"
:require (("https://gitlab.common-lisp.net/alexandria/alexandria.git"
:branch "master"
:commit "f283e25efbe9f4323419a138b22ad2fc027f6641")))
What it gives you
- Pins, not ranges. Every requirement is a commit, recorded with the branch or tag it was read from. The same stiftfile gives the same code on every machine, at any time, with no server between a project and its dependencies' repositories.
- Commits chosen by history. Each project's stiftfile says what it
needs, and stift chooses, for each project of the build, the commit
required of it that contains all the others, as Go chooses versions.
stift tidywrites the whole build list into the stiftfile, so that a moved pin shows in its diff, andstift updatemoves pins along their branches and tags. - Workspaces. Checkouts of several projects build together while they
are changed together, uncommitted changes and all, and
stift work syncmoves their pins on each other once the changes are pushed. - ASDF set up exactly. A Lisp started with
stift execfinds the build list's systems and no others: no init files, no central registry, no Quicklisp. Fasls go to a directory of each build list's own, so a fasl is never loaded against other commits than it was compiled with. - Tests in fresh Lisps.
stift testruns each suite in a new SBCL or CCL, and its exit status says whether every suite passed. - Missing systems found.
stift checkloads the.asdfiles with the build list and follows every system's dependencies, so a system no project provides shows before a build fails on it. - Vendoring, verified.
stift vendorcopies the build list into the project, which then builds without the network or the repositories it requires, andstift verifychecks each copy, and each checkout in the cache, against its commit. - Safe to read. stift reads stiftfiles with a reader of its own, which evaluates and interns nothing, and edits them entry by entry, keeping comments with their entries.
- Few dependencies. ASDF and UIOP as SBCL and CCL ship them, and the git program, which does the network, the hashing and the checkouts.
Pages
| Page | What it covers |
|---|---|
| Getting Started | Requirements, installing a release's executable or building with install.lisp, a first project, stift's own tests |
| The Stiftfile | What a stiftfile holds, how projects are named, which URLs stift fetches from |
| Choosing Commits | How stift chooses a commit of each project, tidy, the check before a build, replacements, collisions, why and graph |
| Workspaces | The stiftwork, building checkouts together, and moving their pins with work sync |
| Commands | Every command, its options and its exit status |
| Starting Lisps | stift exec, the setup file and what it checks, other programs, SLY |
| Running Tests | stift test, and what a test system's test-op must do |
| Building Programs | stift build: executables, as asdf:make builds them, and which system it builds |
| Checking Systems | stift check: the systems the build list lacks, and requirements to fix |
| Vendoring | stift vendor: the build list copied into the project, built from without the network; stift verify |
| The Cache | Where stift keeps repositories, checkouts and fasls, and the environment variables |
| Errors | stift's conditions, and what their messages mean |
| API Reference | Every exported symbol |
Status
stift has its foundation; requirements read from the stiftfiles of the
projects required, with commits chosen by git's history; workspaces;
check; build; an install from a clone; and vendoring, with verify.
It runs on Linux and on Windows, and each release carries the executable
for Linux on x86-64. The design is in stift.org of the
engine's workspace.
Licence
MIT. See LICENSE in the repository.