How can I control the license agreement for my package's code?

← Getting Started · Ref: Q9

EK9 packages declare their license inside `defines package` using the `license` field. This is a String value that specifies the terms under which others may use your code.

Declare the license:

  license <- "MIT"

Common open source licenses:

  "MIT"            permissive, minimal restrictions
  "Apache-2.0"     permissive with patent grant
  "GPL-3.0"        copyleft, derivatives must also be GPL
  "BSD-2-Clause"   permissive, simple
  "LGPL-3.0"       copyleft for libraries, linking permitted
  "MPL-2.0"        file-level copyleft

For proprietary code:

  "Proprietary"    or your company's license name

The license field works together with `publicAccess`:
publicAccess <- true means anyone can download and use the package.
publicAccess <- false means private, restricted distribution.

A package with `publicAccess <- true` and `license <- "MIT"` tells consumers they can freely use, modify, and redistribute the code with attribution.

A package with `publicAccess <- false` and `license <- "Proprietary"` is restricted to authorized users only.

The license value is metadata: EK9 does not enforce license compliance at compile time. It is your responsibility to ensure your dependencies' licenses are compatible with your own. The `description` field can include additional terms if needed.

The code example below shows two typical licensing configurations.

See Q7 for managing dependencies. See Q8 for tagging packages.

Example

#!ek9
defines module qa.getting.started.package.licensing

  defines package

    version as Version: 1.0.0-0
    description as String = "Open source utility with MIT license"
    license <- "MIT"
    publicAccess <- true

    tags <- [
      "utility",
      "open-source"
    ]

    applyStandardIncludes <- true

  defines program
    PackageLicensing()
      stdout <- Stdout()

      stdout.println("Package license: MIT")
      stdout.println("Public access: true")
      stdout.println("Anyone can use, modify, and redistribute with attribution")

Common mistakes

E01040 — Defining two constructs with the same name in the same module triggers E01040 — duplicate construct. Each program name must be unique. See ek9 -h E01040 for details.

Incorrect:

defines program
    PackageLicensing()
      stdout <- Stdout()
    PackageLicensing()
      stdout <- Stdout()

Correct:

defines program
    PackageLicensing()
      stdout <- Stdout()
Other ways to ask this
  • How do I set a license on my EK9 package?
  • What licenses can I use for EK9 packages?
  • How does licensing work in defines package?
  • How do I make my EK9 code open source?
  • I set license in Cargo.toml or package.json, how do I do it in EK9?

Coming from another language?

Python: pyproject.toml license field or LICENSE file. Java: Maven pom.xml <licenses> section. Rust: Cargo.toml license field (SPDX identifier). npm: package.json license field. Go: LICENSE file by convention. EK9 uses a simple String field in the source file, similar to Rust's approach.

Keywords: MIT, beginner, cargo, copyright, distribution, first, intro, license, npm, open-source, package, proprietary, publicAccess, spdx, start, terms