Reika

Reika is an opinionated dependency manager and build initiator tool, primarily for Common Lisp projects. Examples of projects that use Reika are Benben and XQATool.

This project is still very early in development. It can be used to build things, but is still quite touchy, missing features, and doesn't have good error messages. YMMV.

Reika is entirely written and maintained by one person, Remilia Scarlet! If you want to support her and Reika, you can buy her a coffee on Ko-Fi, or support her through Liberapay. Support is greatly appreciated for this volunteer effort ^_^

Buy Me a Coffee at ko-fi.com Donate using Liberapay

How do I get set up?

You will need Fossil and Crystal to build Reika. When using Reika to build other projects, you probably want to have both Fossil and Git installed, at a minimum.

It has been tested with Crystal 1.12.2, but most other versions should work.

To build Reika from source:

  1. Clone this repository somewhere using Fossil.
  2. Change into the directory where you cloned the repository.
  3. Run shards build -p (or shards build --release -p).
  4. The binary will be in the bin/ directory.

How to Build a Project that Uses Reika

  • To build a project, change into its directory and run reika build.
  • To just gather a project's dependencies, change into its directory and run reika update.
  • You can run reika help (or reika <some command> --help) for more ways to run Reika.

For more detailed usage, check out the manual

How to Use Reika for Your Own Project

To use Reika for your own project, please consult the manual.

Frequently Questioned Answers

  • Why write it in Crystal?: For easier bootstrapping. Since the primary goal is to be able to build Common Lisp projects without having to touch a REPL, ASDF, or Quicklisp, it wouldn't make sense to write this in Common Lisp. So, Crystal was instead chosen since the Shards program (which is used to build Crystal software) is just as easy to use.

    So basically, to make it easier for end users who want to build Lisp software but are not Lispers themselves.

  • Will it work for non-Lisp projects?: Technically yes using the cmd key in the project file. In fact I plan to use it for a Pascal projects since, in Pascal land (as far as I know) the norm is to maintain your dependencies in-tree. That said, when it comes to Reika, only Lisp is officially supported, so you’re on your own for other languages.

  • Why not extend ASDF?: Because ASDF is a build system, not a dependency manager. It can do some dependency-related things, like version checking, but in my opinion, it should not do much else except build software. Also, the primary goal is to make it easy for non-Lispers to build software that’s written in Lisp. Having them start a REPL and call ASDF commands is antithetical to this goal.

  • What about Quicklisp?: Quicklisp is nice in general, but not necessarily for non-Lispers. Nor does it solve the problem of actually building a binary for a project. Also, I have never used Quicklisp and I don’t intend to start.

  • Can you add Darcs support?: No. Well, maybe in the future I’ll allow it, but for now, no. Consider using a better VCS.

  • Can I use this to manage dependencies for my library?: I highly discourage this. It’s meant specifically for projects that create a binary executable such as Benben and XQATool.

  • Why use RSConf for the project file?: RSConf is chosen because it results in no external dependencies (e.g. libyaml), yet still allows stuff like comments (unlike JSON). In fact, it was specifically designed for uses such as this, so it just makes sense to use it.

  • Why do the ‘mod’ key in version like that? Why not symbols?: To prevent ambiguity or confusion. I can never remember what the heck ~> means compared to => or >= or whatever without looking up the docs. So I took some inspiration from Ada and changed them to plain English.

    Also, in my own experience, you just want a specific checkout/tag/branch in 99% of cases anyway, or just a simple "this version or greater". No need to complicate it much further.

  • I have a project on my local disk that isn’t in a web-accessible repo yet. Can I still use it?: Yes! Just set the dependency's type to local and place the source path into location. Reika will symlink it into your deps/ directory automatically. The version/tag stuff is then ignored. Just remember, local dependencies cannot be vendored.

  • Why name it "Reika"?: It's named after an anime character. It's just something I tend to do.

Development

Style info

I use a somewhat non-standard style for my code.

  • Keep lines 118 characters or shorter. Obviously sometimes you can't, but please try. Use 80 or 115 characters for Markdown files, though.
  • Please use pascalCase for variable and method names. Use CamelCase for type names. Use UPPER_SNAKE_CASE for constants.
  • ALWAYS put parentheses around method parameters, except for these methods: puts, pp, p, raise, sleep, spawn, loop, and exit.
  • Always the full do |foo|...end syntax with blocks, except when it's all on one line, then always use { and }.
  • The type name for exceptions end with Error. For example, ExternalProgramError.

How do I contribute?

  1. Go to https://fossil.cyberia9.org/reika/ and clone the Fossil repository.
  2. Create a new branch for your feature.
  3. Push locally to the new branch.
  4. Create a bundle with Fossil that contains your changes.
  5. Get in contact with me.

Contributors

Links and Licenses

Reika is under the GNU Affero General Public License version 3.