Skip to main content

Package Structure

Packages are versioned collections of modules that form a distributable unit.

Package Types

// === package.gleam ===

/// Package specification - public interface for dependency resolution
/// Used when this package is a dependency of another
pub type PackageSpecification(attributes) {
PackageSpecification(
modules: Dict(ModulePath, ModuleSpecification(attributes)),
)
}

/// Package definition - complete implementation
/// Used for the local project being compiled
pub type PackageDefinition(attributes) {
PackageDefinition(
modules: Dict(ModulePath, AccessControlled(ModuleDefinition(attributes))),
)
}

Design Decisions

DecisionChoiceRationale
Module accessAccessControlled on definitionsModules can be package-private
No module docsDocs at type/value levelModule-level docs in separate metadata
Path as keyDict(ModulePath, ...)Hierarchical organization preserved

Package Hierarchy

PackageDefinition
└── modules: Dict(ModulePath, AccessControlled(ModuleDefinition))
├── "main/domain" (Public)
│ └── ModuleDefinition
│ ├── types: Dict(Name, AccessControlled(Documented(TypeDefinition)))
│ └── values: Dict(Name, AccessControlled(Documented(ValueDefinition)))

└── "internal/utils" (Private)
└── ModuleDefinition
└── ...

JSON Serialization

PackageSpecification

{
"modules": {
"main/domain": {
"types": {
"user": { "TypeAliasSpecification": { "body": { "..." } } }
},
"values": {
"create-user": { "inputs": { "..." }, "output": { "..." } }
}
}
}
}

PackageDefinition

{
"modules": {
"main/domain": {
"access": "Public",
"types": {
"user": {
"access": "Public",
"TypeAliasDefinition": { "body": { "..." } }
}
},
"values": {
"create-user": {
"access": "Public",
"ExpressionBody": { "..." }
}
}
},
"internal/utils": {
"access": "Private",
"types": { "..." },
"values": { "..." }
}
}
}