8 Home
dxtr edited this page 2026-10-18 04:49:13 +02:00

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 tidy writes the whole build list into the stiftfile, so that a moved pin shows in its diff, and stift update moves 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 sync moves their pins on each other once the changes are pushed.
  • ASDF set up exactly. A Lisp started with stift exec finds 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 test runs each suite in a new SBCL or CCL, and its exit status says whether every suite passed.
  • Missing systems found. stift check loads the .asd files 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 vendor copies the build list into the project, which then builds without the network or the repositories it requires, and stift verify checks 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.