Skip to content

Project layout ​

The package manager uses a small, Cargo-like directory layout:

text
hello/
├── ligare.toml
├── src/
│   ├── main.lig
│   └── math.lig
└── tests/
    └── arithmetic_test.lig

Binary packages use src/main.lig by default. The entry file must define a public main computation:

ligare
pub def main : IO () := ()

Library packages use src/lib.lig by default and do not require main. Specify type = binary or type = lib when the package type should be explicit.

The manifest ​

toml
[package]
name = "hello"
version = "0.1.0"
type = "binary"

[dependencies]
mathlib = { path = "../mathlib" }

The entry field can select another source file. Dependencies may use a local path or a Git URL, with an optional version, tag, or commit selector. Dependency resolution writes ligare.lock.

Modules ​

Source modules are declared in the entry module and are mapped to files:

ligare
mod math
use math::add

pub def main : IO () :=
  let _ = add 1 2 in ()

The corresponding src/math.lig can contain:

ligare
pub def add (left right : int) : int := left + right

Only public definitions and modules can be imported by another module or package. The Modules page explains nested modules and imports.

Tests ​

ligare test recursively finds source files whose names end in _test.lig and checks them as package entries. Keep executable entry points in src/main.lig; test files are for compile-time checks and regression coverage.