{"record":{"id":"8dcd5c3a025967b8","repo":"composer/composer","slug":"strict-psr-autoloader-mode-only-works-with-optim","errorCode":null,"errorMessage":"--strict-psr-autoloader mode only works with optimized autoloader, use --optimize-autoloader or --classmap-authoritative if you want a strict return value.","messagePattern":"--strict-psr-autoloader mode only works with optimized autoloader, use --optimize-autoloader or --classmap-authoritative if you want a strict return value\\.","errorType":"validation","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Composer/Command/InstallCommand.php","lineNumber":125,"sourceCode":"        if (!$composer->getLocker()->isLocked() && !HttpDownloader::isCurlEnabled()) {\n            $io->writeError('<warning>Composer is operating significantly slower than normal because you do not have the PHP curl extension enabled.</warning>');\n        }\n\n        $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output);\n        $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent);\n\n        $install = Installer::create($io, $composer);\n\n        $config = $composer->getConfig();\n        [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input);\n\n        $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader');\n        $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative');\n        $apcuPrefix = $input->getOption('apcu-autoloader-prefix');\n        $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader');\n\n        if ($input->getOption('strict-psr-autoloader') && !$optimize && !$authoritative) {\n            throw new \\InvalidArgumentException('--strict-psr-autoloader mode only works with optimized autoloader, use --optimize-autoloader or --classmap-authoritative if you want a strict return value.');\n        }\n\n        $composer->getInstallationManager()->setOutputProgress(!$input->getOption('no-progress'));\n\n        $install\n            ->setDryRun($input->getOption('dry-run'))\n            ->setDownloadOnly($input->getOption('download-only'))\n            ->setVerbose($input->getOption('verbose'))\n            ->setPreferSource($preferSource)\n            ->setPreferDist($preferDist)\n            ->setDevMode(!$input->getOption('no-dev'))\n            ->setDumpAutoloader(!$input->getOption('no-autoloader'))\n            ->setOptimizeAutoloader($optimize)\n            ->setClassMapAuthoritative($authoritative)\n            ->setStrictPsrAutoloader($input->getOption('strict-psr-autoloader'))\n            ->setApcuAutoloader($apcu, $apcuPrefix)\n            ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input))\n            ->setPolicyConfig($this->createPolicyConfig($composer->getConfig(), $input))","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/composer/composer/blob/6ffc1177404d0c50119c22dde6564a380f4a82c9/src/Composer/Command/InstallCommand.php#L107-L143","documentation":"Thrown by InstallCommand::execute when `--strict-psr-autoloader` is set but neither `--optimize-autoloader` (nor config `optimize-autoloader`) nor `--classmap-authoritative` (nor config `classmap-authoritative`) is enabled. Strict PSR-4 checking only emits warnings while building the classmap, which requires one of those classmap-generating modes; running it without optimization would be a no-op, so Composer refuses.","triggerScenarios":"Running `composer install --strict-psr-autoloader` (or `composer update` likewise) without also enabling optimization. Also triggered in CI configs that copy `--strict-psr-autoloader` from a guide but drop the optimize flag for speed.","commonSituations":"Production-style flags used in dev where optimization is intentionally off; config drift after upgrading Composer; misconfigured Docker build step.","solutions":["Add `--optimize-autoloader` (or `--classmap-authoritative`) alongside `--strict-psr-autoloader`.","Set `config.optimize-autoloader` or `config.classmap-authoritative` in composer.json so the flag is implied.","In dev, run a separate `composer dump-autoload --optimize --strict-psr` if you only want the check occasionally."],"exampleFix":"// before\n$ composer install --strict-psr-autoloader\n// after\n$ composer install --strict-psr-autoloader --optimize-autoloader","handlingStrategy":"validation","validationCode":"// before invoking install, ensure strict implies optimize:\n$strict = true;  // from your flags\n$optimize = true || (bool) ($config['optimize-autoloader'] ?? false)\n           || (bool) ($config['classmap-authoritative'] ?? false);\nif ($strict && !$optimize) {\n    throw new \\LogicException('Add --optimize-autoloader when using --strict-psr-autoloader');\n}","typeGuard":"/** @param array<string,mixed> $flags */\nfunction strictPsrOk(array $flags): bool {\n    $strict = $flags['strict-psr-autoloader'] ?? false;\n    $opt = ($flags['optimize-autoloader'] ?? false) || ($flags['classmap-authoritative'] ?? false);\n    return !$strict || $opt;\n}","tryCatchPattern":"try {\n    $app->run(new StringInput('install --strict-psr-autoloader'));\n} catch (\\InvalidArgumentException $e) {\n    // append --optimize-autoloader and retry\n}","preventionTips":["Pair --strict-psr-autoloader with --optimize-autoloader in CI.","Set config.optimize-autoloader in composer.json so the flag is always implied.","Run strict checks in a dedicated dump-autoload step to keep dev installs fast."],"tags":["validation","cli","autoloader","options","psr-4"],"analyzedSha":"6ffc1177404d0c50119c22dde6564a380f4a82c9","analyzedAt":"2026-08-07T00:01:08.491Z","schemaVersion":2},"datasetVersion":"2026-08-07T02:17:10.218Z"}