Executors

WBS dispatches Tasks to Executors. An Executor knows how to do particular types of Tasks, and can provide any additional context.

Executors are the small set of built-in operations that can touch the outside world or run programs. They are the only place where a computation can do something non-deterministic (like use the network), and each is designed so that its successful outputs are fully determined by its inputs.

Want Executor

Tasks directly related to planning, building, or manipulating files are executed by the Want Executor.

Here are a few examples:

  • want.pick extracts a subpath from a WantFS instance and returns a new instance containing just the subpath shifted to the root.
  • want.place is the opposite of pick.
  • want.build builds a want module provided as a WantFS instance.
  • want.plan is the planning portion of the build, separated so that it can be cached separately.

I/O Executor

This executor performs all input and output tasks. If something is incoming or outgoing to/from the build system, then it goes through this executor.

Linux Executor

This executor spawns Linux containers to execute tasks. Think of this as "Linux as a Service".

Wasm Executor

This executor runs WebAssembly programs.

MVM Executor

This executor performs computations defined in the Mycelium format. Mycelium Procs can be applied to data with mvm.apply. Mycelium Lazys can be evaluated with mvm.eval.

All of the want files are evaluated using this executor.

Spore Executor

This executor calls into the Spore compiler. It is used to compile want files, module configuration files, and Spore libraries into Mycelium programs, which can be executed by the MVM executor.