How do I manage dependencies in EK9?

← Getting Started · Ref: Q7

EK9 manages dependencies as a first-class language feature inside `defines package`.

No separate build file (pom.xml, Cargo.toml, go.mod) is needed. Everything lives in your .ek9 source file.

Package metadata:

  version as Version: 1.0.0-0          semantic version with build number
  description as String = "..."         what the package does
  license <- "MIT"                      license identifier
  tags <- [ "tools", "networking" ]     categorization tags
  publicAccess <- true                  visible to other packages

Dependencies use Dict literals:

  deps <- {
    "ekopen.network.utils": "1.6.1-9"
  }

Dev-only dependencies (not included in production):

  devDeps <- {
    "ekopen.test.helpers": "2.0.0-0"
  }

Exclude transitive dependencies:

  excludeDeps <- {
    "unwanted.transitive.dep": "ekopen.network.utils"
  }

CLI commands for the dependency lifecycle:

  ek9 -Dp app.ek9             resolve dependencies (cleans first)
  ek9 -Dp -v app.ek9          resolve and show accepted/rejected deps
  ek9 -I app.ek9              install to local library cache
  ek9 -P app.ek9              package for deployment (uses -O3)
  ek9 -D app.ek9              deploy (triggers -P and -Gk if needed)
  ek9 -Gk app.ek9             generate signing keys

Version management:

  ek9 -IV minor app.ek9       increment minor version
  ek9 -SV 2.0.0 app.ek9       set version explicitly
  ek9 -PV app.ek9             print current version

Version format: MAJOR.MINOR.PATCH-BUILD (e.g., 1.0.0-0)
Feature branches: MAJOR.MINOR.PATCH-FEATURE-BUILD (e.g., 1.0.0-beta-5)

Semantic versioning is enforced:
- Same MAJOR.MINOR: highest PATCH is auto-selected
- Different MAJOR: build fails (breaking API change)
- Circular dependencies are detected and rejected

The code example below shows a complete package definition with dependencies.

See Q8 for tagging packages for discovery. See Q9 for licensing. See Q10 for dev vs production dependencies. See Q11 for excluding transitive dependencies. See Q13 for packages vs modules. See Q14 for listing resolved dependencies. See Q15 for semantic versioning. See Q270 for supply chain security.

Example

defines module qa.getting.started.manage.dependencies

  defines package

    version as Version: 1.0.0-0
    description as String = "Example package showing dependency management"
    license <- "MIT"
    publicAccess <- true

    tags <- [
      "example",
      "getting-started"
    ]

    applyStandardIncludes <- true

    deps <- {
      "ekopen.network.support.utils": "1.6.1-9",
      "ekopen.net.handy.tools": "3.2.1-0"
    }

    devDeps <- {
      "ekopen.org.supertools.util": "4.6.1-6"
    }

    excludeDeps <- {
      "ekopen.some.unwanted.pack": "ekopen.org.supertools.util"
    }

  defines program
    ManageDependencies()
      stdout <- Stdout()

      stdout.println("Package with dependencies defined")
      stdout.println("Run: ek9 -Dp thisFile.ek9 to resolve")
      stdout.println("Run: ek9 -PV thisFile.ek9 to see version")
Other ways to ask this
  • How do I add a library dependency?
  • How do I declare package dependencies?
  • What is defines package in EK9?
  • How does EK9 handle third-party libraries?
  • How do I publish or deploy an EK9 package?
  • What replaces pom.xml or build.gradle in EK9?
  • I use Maven/Gradle for dependencies, how does EK9 handle this?

Coming from another language?

Python: pip/requirements.txt/pyproject.toml. Java: Maven pom.xml or Gradle build.gradle. Rust: Cargo.toml [dependencies]. Go: go.mod require directives. Node: package.json dependencies. EK9 embeds all of this directly in the source file as a language construct, not a separate configuration format.

Keywords: devDeps, start, install, cargo, publish, gradle, first, intro, beginner, pip, semantic, mvn, deps, maven, pom, package, npm, import, versioning, deploy, version, dependencies, library