{"record":{"id":"ea6fa9d6cfefd40f","repo":"angular/angular-cli","slug":"the-output-location-of-the-browser-build-has-been","errorCode":null,"errorMessage":"The output location of the browser build has been updated from \"${outputPath}\" to \"${join(outputPath, 'browser')}\". You might need to adjust your deployment pipeline or, as an alternative, set outputPath.browser to \"\" in order to maintain the previous functionality.","messagePattern":"The output location of the browser build has been updated from \"(.+?)\" to \"(.+?)\"\\. You might need to adjust your deployment pipeline or, as an alternative, set outputPath\\.browser to \"\" in order to maintain the previous functionality\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/schematics/angular/migrations/use-application-builder/migration.ts","lineNumber":69,"sourceCode":"      options['index'] = false;\n    }\n\n    // Rename and transform options\n    options['browser'] = options['main'];\n    if (serverTarget && typeof options['browser'] === 'string') {\n      options['server'] = dirname(options['browser']) + '/main.server.ts';\n    }\n    options['serviceWorker'] = options['ngswConfigPath'] ?? options['serviceWorker'];\n\n    if (typeof options['polyfills'] === 'string') {\n      options['polyfills'] = [options['polyfills']];\n    }\n\n    let outputPath = options['outputPath'];\n    if (typeof outputPath === 'string') {\n      if (!/\\/browser\\/?$/.test(outputPath)) {\n        // TODO: add prompt.\n        context.logger.warn(\n          `The output location of the browser build has been updated from \"${outputPath}\" to ` +\n            `\"${join(outputPath, 'browser')}\". ` +\n            'You might need to adjust your deployment pipeline or, as an alternative, ' +\n            'set outputPath.browser to \"\" in order to maintain the previous functionality.',\n        );\n      } else {\n        outputPath = outputPath.replace(/\\/browser\\/?$/, '');\n      }\n\n      options['outputPath'] = {\n        base: outputPath,\n      };\n\n      if (typeof options['resourcesOutputPath'] === 'string') {\n        const media = options['resourcesOutputPath'].replaceAll('/', '');\n        if (media && media !== 'media') {\n          options['outputPath'] = {\n            base: outputPath,","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/schematics/angular/migrations/use-application-builder/migration.ts#L51-L87","documentation":"The use-application-builder migration moves projects from the browser builder to the application builder, which outputs browser assets into a 'browser' subdirectory of outputPath. This warning tells you the effective output location changed and downstream consumers (deployment scripts, pipelines) may need updating, or you can set outputPath.browser to \"\" to keep old behavior.","triggerScenarios":"Running ng update (use-application-builder migration) -> updateProjects -> updateBuildTarget on a project whose build target outputPath is a string not ending in '/browser' or '/browser'.","commonSituations":"Upgrading an Angular CLI workspace whose deploy pipeline copies files from a flat dist folder (e.g. dist/my-app) after the builder switch to @angular-devkit/build-angular:application.","solutions":["Update your deployment pipeline/CI scripts to read from <outputPath>/browser","Alternatively set outputPath as an object: { \"base\": \"dist/my-app\", \"browser\": \"\" } to preserve the old flat layout","Re-run the build and verify the dist output path used by deployment matches"],"exampleFix":"// before (angular.json)\n\"outputPath\": \"dist/my-app\"\n// after option A\n\"outputPath\": \"dist/my-app\" // deploy from dist/my-app/browser\n// after option B (keep old behavior)\n\"outputPath\": { \"base\": \"dist/my-app\", \"browser\": \"\" }","handlingStrategy":"validation","validationCode":"// before upgrading, detect outputs consumed by deploy scripts\nconst outputPath = angularJson.projects[proj].architect?.build?.options?.outputPath;\nconst isString = typeof outputPath === 'string';\nconst needsBrowserDir = isString && !/\\/browser\\/?$/.test(outputPath);\nif (needsBrowserDir) console.warn(`${outputPath} will move to ${outputPath}/browser after application-builder migration`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reference dist output via builder-provided paths or environment variables in CI","Prefer the structured outputPath object with explicit base/browser over string paths","After ng update, always smoke-test the deployment pipeline against the new dist layout"],"tags":["angular","schematics","migration","application-builder","output-path"],"backgroundTag":"output-path-browser-subdirectory","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}