cc-pkg: A ComputerCraft Package Manager

ComputerCraft is a Minecraft mod that adds Lua-based computers. Over time, many programs have been created, and several package managers have come and gone. As I write this, all that I have seen are gone – their original authors have moved on, and shut down the servers hosting packages.

Now it’s my turn to sell you a package manager: cc-pkg. Unlike the others, I expect this to remain viable – even if I’m gone from the picture. If you want to skip to trying it, here’s how it’s installed (and how to ask for help):

pastebin get 9Li3u4Rc /bin/pkg
/bin/pkg help

(I’d also recommend installing the unix-like package, which adds /bin to your path, among a few other small tweaks.)

Why is cc-pkg different?

  1. It is built on ComputerCraft’s pastebin integration.
  2. It does not require a maintainer.
  3. It is extremely simple – and flexible.

cc-pkg has the same three sub-commands of the default pastebin program: get, run, and put*. They each do exactly what you’d expect them to do, except they can use package names as well as pastebin IDs. Package names are alphanumeric characters and dashes, and there are two types of packages.

Both are plaintext lists of the form key=value. The main type of package is a list of file paths (all starting with a forward slash) as keys set to package names or pastebin IDs as values. This is how cc-pkg knows which files to download and where to put them. The second type is simply called a list; and contains package names as keys, set to package names or pastebin IDs. Lists are saved to a local file cc-pkg uses to resolve package names – overwriting any existing entries with the same package name, which is how updating is done.

With just those core features, I think the system is viable. But since writing the first draft of this, I added one more feature to make cc-pkg more extensible: command extensions.

Under the Hood

cc-pkg keeps metadata through the following files:

  • /etc/pkg/names.list: The master list of package names cc-pkg knows.
  • /etc/pkg/ids.list: A raw ordered list of every pastebin ID cc-pkg has successfully downloaded.
  • /etc/pkg/<package-name>: The file describing each installed package is itself stored by name.

It uses global functions so that it can be loaded as an API to make a more advanced package management system on top of it – or just to make programs automatically download requirements using cc-pkg.

  • get(name_or_id, path): The core function that installs a package (path is optional).
  • down(id): Downloads from a pastebin ID.
  • save(path, data): Writes data to a file.
  • append(path, data): Appends data to a file.
  • id(name_or_id): Recursively checks the package names list until a pastebin ID is returned.
  • type(data): Recognizes data as a package, list, or unknown type.
  • src(data): Combines this data with existing package names (overwriting if duplicates exist).

On top of this, if a file is saved to /lib/pkg-commands/<name> and a user runs pkg <name>, that file will be run with the other arguments. This allows adding new functions, and overwriting the core functions to add additional features, if desired.

An example of this is the pkg-search package, which adds a search command to look for specific package names within the master list. I am also considering adding an extension which downloads short descriptions of packages, allowing you to view what is available.

*The put command is not implemented as of version 1.4.2 1.5.2, the latest at the time of writing finishing this introduction.