{"record":{"id":"c745a4dcedde43f3","repo":"apple/pkl","slug":"output-file-outputfile-is-a-directory-did-you","errorCode":null,"errorMessage":"Output file `$outputFile` is a directory. Did you mean `--multiple-file-output-path`?","messagePattern":"Output file `\\$outputFile` is a directory\\. Did you mean `--multiple-file-output-path`\\?","errorType":"exception","errorClass":"CliException","httpStatus":null,"severity":"error","filePath":"pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt","lineNumber":167,"sourceCode":"    return evaluateExpressionString(moduleSource, options.expression)\n      .toByteArray(StandardCharsets.UTF_8)\n  }\n\n  /** Renders each module's `output.bytes`, writing it to the specified output file. */\n  private fun writeOutput(builder: EvaluatorBuilder) {\n    val evaluator = builder.setOutputFormat(options.outputFormat).build()\n    evaluator.use { ev ->\n      val outputFiles = fileOutputPaths\n      if (outputFiles != null) {\n        // files that we've written non-empty output to\n        // YamlRenderer produces empty output if `isStream` is true and `output.value` is empty\n        // collection\n        val writtenFiles = mutableSetOf<Path>()\n\n        for ((moduleUri, outputFile) in outputFiles) {\n          val moduleSource = toModuleSource(moduleUri, inputStream)\n          if (Files.isDirectory(outputFile)) {\n            throw CliException(\n              \"Output file `$outputFile` is a directory. \" +\n                \"Did you mean `--multiple-file-output-path`?\"\n            )\n          }\n          val output = ev.evalOutput(moduleSource)\n          outputFile.createParentDirectories()\n          if (!writtenFiles.contains(outputFile)) {\n            // write file even if output is empty to overwrite output from previous runs\n            outputFile.writeBytes(output)\n            if (output.isNotEmpty()) {\n              writtenFiles.add(outputFile)\n            }\n          } else {\n            if (output.isNotEmpty()) {\n              outputFile.writeString(\n                options.moduleOutputSeparator + '\\n',\n                Charsets.UTF_8,\n                StandardOpenOption.WRITE,","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt#L149-L185","documentation":"In single-file output mode, CliEvaluator.writeOutput checks whether the target output path is an existing directory before writing; if so it throws this error and hints that the user probably intended multiple-file output mode. This happens because evaluating `output.files` output into a single output path doesn't make sense.","triggerScenarios":"Running a command whose evaluated output is written to a path that already exists as a directory — e.g. passing a directory to the plain output path argument, or re-running against a directory produced by a previous --multiple-file-output-path run.","commonSituations":"Mixing single-file and multiple-file output invocations on the same path; typos in the output path argument (pointing at a directory instead of a file); shell scripts that pass $OUTPUT_DIR where a file is expected.","solutions":["If you intended multiple-file output, use `--multiple-file-output-path` instead.","Otherwise, specify a file path (not an existing directory) as the output, or delete/rename the directory.","Fix shell scripts to pass a concrete file path for single-file output.","Clean output directories between runs."],"exampleFix":"# before\n$ pkl eval mymod.pkl out/   # out/ is a directory\n# after\n$ pkl eval mymod.pkl --multiple-file-output-path out/","handlingStrategy":"validation","validationCode":"import java.nio.file.Files\nimport java.nio.file.Path\nrequire(!Files.isDirectory(Path.of(outputFile))) { \"Output path $outputFile is a directory; use --multiple-file-output-path\" }","typeGuard":null,"tryCatchPattern":"try {\n  ev.writeOutput(...)\n} catch (e: CliException) {\n  if (e.message?.contains(\"multiple-file-output-path\") == true) {\n    // rerun with --multiple-file-output-path\n  }\n}","preventionTips":["Pass a file path for single-file output and a directory only with --multiple-file-output-path.","Avoid reusing multi-file output directories as single-file output targets.","Quote and verify output path variables in shell scripts."],"tags":["cli","output-path","filesystem"],"backgroundTag":"path-is-not-a-directory","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}