Idris is a pretty neat language. But it doesn’t have a package manager, which means managing large projects becomes a bit of a chore.

So, in my spare time, I’ve worked on a package manager of my own. It’s called elba and it takes heavy inspiration from the likes of Cargo, Pub, and Cabal. It’s still very early days, and there are probably bugs hiding everywhere, but in this dev’s humble opinion, it’s good enough for experimentation and small-to-medium-sized projects: it features robust dependency resolution, build caching, and fully-functional package building, testing, and installation.

Getting started

Binary releases are available via GitHub Releases. Just download the archive corresponding to the platform of your choice, put the executable somewhere in your path, add ~/.elba/bin to your PATH and you should be good to go.

Alternatively, if you’d prefer to build the project yourself, you’ll need to have the Rust toolchain installed, as elba is written in Rust (more on that later). After that, installation is a piece of cake:

$ cargo install elba
# remember to add `~/.elba/bin` to your PATH afterwards!

From there, all the typical package-manager-y commands should work as you’d expect:

$ elba new me/test # all names in elba are namespaced
$ cd test
$ elba build 
$ elba repl

A short demo of some of elba’s basic functionality is available on asciinema, and more detailed documentation is also available online in the form of a guide.

Motivation

elba exists because trying to use other people’s packages in Idris right now is a bit of a pain. The most comprehensive grouping of packages available for Idris is a wiki page, and the most widely-accepted solution for dependency management is “download them yourself and hope that everything just works™.” Additionally, the widely-used ipkg format seems to be more of a stop-gap solution than anything else.

System package manager

The first alternative to writing yet another package manager for a language is to just rely on system package managers: apt and pacman and brew and dnf and … have already solved this problem, and nix is a somewhat cross-platform system package manager which provides even more fancy features (fancy configuration, completely reproducible builds, etc.). Unfortunately, relying on system package managers to host language libraries doesn’t work out too well in practice:

In short, trying to rely on system package managers to save on implementation would be more trouble than it’s worth.

Other package management attempts

elba isn’t the first attempt at a package management system for Idris; as far as I know, there are two other Idris package management projects also in the works. I’ve previously made a comment on comparing those two alongside elba on r/idris wherein I tried my best to stay neutral-ish. However, since this is my blog post and my objective now is to sell out as hard as possible for my own software, I’ll approach this comparison from a more biased point of view:

What elba does differently

So with all that complaining out of the way, the question remains: what does elba do differently?

Limitations

This is a very early release, so there are still definite limits to what elba is capable of:

Conclusion

If you’d like to know more about elba, there’s a short lil guide available online with some more details on usage and design decisions.

The best way to help out with the project is to just use it! Not only will that help with finding bugs and other missing features, but hopefully it will move the Idris package ecosystem as a whole forwards.