apple/pkl · error · CliException
`sourceModules` contains multiple modules named `docsite-inf
Error message
`sourceModules` contains multiple modules named `docsite-info.pkl`:
${docsiteInfoModuleUris.joinToString("\n")} What it means
The pkl-doc CLI refuses to run when the `sourceModules` list contains more than one module named `docsite-info.pkl`. Each docsite can have exactly one docsite-info module defining its metadata, so duplicates are ambiguous. The error lists every URI found so the duplicate can be located.
Source
Thrown at pkl-doc/src/main/kotlin/org/pkl/doc/CliDocGenerator.kt:190
docsiteInfoModuleUris.add(moduleUri)
moduleUri.path?.endsWith("/doc-package-info.pkl", ignoreCase = true) ?: false ->
packageInfoModuleUris.add(moduleUri)
moduleUri.scheme == "package" -> {
if (moduleUri.fragment != null) {
throw CliException("Cannot generate documentation for just one module within a package")
}
try {
packageUris.add(PackageUri(moduleUri))
} catch (e: URISyntaxException) {
throw CliException(e.message!!)
}
}
else -> regularModuleUris.add(moduleUri)
}
}
if (docsiteInfoModuleUris.size > 1) {
throw CliException(
"`sourceModules` contains multiple modules named `docsite-info.pkl`:\n" +
docsiteInfoModuleUris.joinToString("\n")
)
}
if (packageInfoModuleUris.isEmpty() && packageUris.isEmpty()) {
throw CliException(
"`sourceModules` must contain at least one module named `doc-package-info.pkl`, or an argument must be a package URI."
)
}
if (regularModuleUris.isEmpty() && packageUris.isEmpty()) {
throw CliException(
"`sourceModules` must contain at least one module to generate documentation for."
)
}
val builder = evaluatorBuilder()View on GitHub (pinned to f3efcbfc9b)
Solutions
- Remove all but one `docsite-info.pkl` module from the `sourceModules` arguments
- Check the URI list printed in the error to see which duplicate paths are being passed
- Deduplicate the argument list in your script/CI config
Example fix
// before pkl-doc docsite-info.pkl ./site/docsite-info.pkl pkg1.pkl // after pkl-doc docsite-info.pkl pkg1.pkl
Defensive patterns
Strategy: validation
Validate before calling
val dupes = sourceModules.filter { it.fileName == "docsite-info.pkl" }
require(dupes.size <= 1) { "Multiple docsite-info.pkl passed: ${dupes.joinToString()}" } Try / catch
try { pklDoc(args) } catch (e: CliException) { if (e.message?.startsWith("`sourceModules` contains multiple modules named") == true) { /* dedupe args and retry */ } else throw e } Prevention
- Keep a single canonical docsite-info.pkl and reference it once
- Lint CI scripts for repeated module arguments
- Deduplicate the argument list programmatically before invoking
When it happens
Trigger: Running `pkl-doc` with multiple module arguments whose file name is `docsite-info.pkl`, e.g. passing docsite-info modules from two different directories or resolved via different paths to the same file.
Common situations: Accidentally passing both a local docsite-info.pkl and one from a dependency; listing the same directory twice with different path spellings; copy-pasting example commands that already include a docsite-info module.
Understand the failure class
Background: "Unknown argument", "Invalid value", and "must be one of": invalid CLI argument errors explained — this error's family across 35 libraries.
Related errors
- Path spec `$pathSpec` contains illegal character `${pathSpec
- `sourceModules` must contain at least one module named `doc-
- `sourceModules` must contain at least one module to generate
- invalidModuleUriMissingSlash
- invalidModuleUriMissingSlash
AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08).
Data as JSON: /api/errors/ffe60475a69b639d.
Report an issue: GitHub.