{"record":{"id":"22c9a5663c1034ef","repo":"gradle/gradle","slug":"build-was-configured-to-prefer-settings-component-22c9a5","errorCode":null,"errorMessage":"Build was configured to prefer settings component metadata rules over project rules but rule '{}' was added by {}","messagePattern":"Build was configured to prefer settings component metadata rules over project rules but rule '(.+?)' was added by (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"platforms/software/dependency-management/src/main/java/org/gradle/internal/management/DefaultDependencyResolutionManagement.java","lineNumber":215,"sourceCode":"                LOGGER.warn(message);\n                break;\n            default:\n                break;\n        }\n    }\n\n    private void ruleMutationDisallowedOnProject(DisplayName ruleName) {\n        UserCodeApplicationContext.Application current = context.current();\n        Describable displayName = current == null ? null : current.getSource().getDisplayName();\n        if (displayName == null) {\n            displayName = UNKNOWN_CODE;\n        }\n        String message = \"Build was configured to prefer settings component metadata rules over project rules but rule '\" + ruleName + \"' was added by \" + displayName;\n        switch (getConfiguredRulesMode()) {\n            case FAIL_ON_PROJECT_RULES:\n                throw new InvalidUserCodeException(message);\n            case PREFER_SETTINGS:\n                LOGGER.warn(message);\n                break;\n            default:\n                break;\n        }\n    }\n\n}\n","sourceCodeStart":197,"sourceCodeEnd":223,"githubUrl":"https://github.com/gradle/gradle/blob/534f27719b66953f95cc907aae7f2c1b12f5482d/platforms/software/dependency-management/src/main/java/org/gradle/internal/management/DefaultDependencyResolutionManagement.java#L197-L223","documentation":"Companion to the repositories-mode warning: DefaultDependencyResolutionManagement.ruleMutationDisallowedOnProject fires when a project registers a component metadata rule (dependencies.components { ... }, components.withComponentMetadataRules, or rule sources) while dependencyResolutionManagement uses RulesMode.PREFER_SETTINGS. The warning names the rule and the source that added it; under FAIL_ON_PROJECT_RULES the same message is thrown as InvalidUserCodeException instead.","triggerScenarios":"settings.gradle declares dependencyResolutionManagement { rulesMode } in PREFER_SETTINGS (or default PREFER_SETTINGS behavior) while a build.gradle contains dependencies.components { withModule(...) { ... } } or a ComponentMetadataRule applied at project scope.","commonSituations":"Teams hoisting dependency management into settings while legacy per-project metadata rules remain; convention plugins applying metadata rules to every project; merging multi-repo builds into one settings-driven build.","solutions":["Move the component metadata rule into dependencyResolutionManagement { components { ... } } in settings.gradle(.kts).","Use the rule name in the message to locate the offending declaration (grep the rule class or withModule id).","If project-scoped rules are required, change rulesMode to PREFER_PROJECT or clear the mode.","Remove now-redundant per-project rules after verifying behavior in the settings block."],"exampleFix":"// before — build.gradle.kts (project scope, warns under PREFER_SETTINGS rules mode)\ndependencies.components { withModule(\"com.example:legacy\") { belongsTo(...) } }\n// after — settings.gradle.kts\ndependencyResolutionManagement {\n    components { withModule(\"com.example:legacy\") { belongsTo(...) } }\n}","handlingStrategy":"try-catch","validationCode":"# detect project-scoped component metadata rules before enabling PREFER_SETTINGS rules mode\ngrep -rn --include='build.gradle*' --include='*.gradle' 'components\\.withModule\\|dependencies.components\\|withComponentMetadataRules' . \\\n  || echo 'no project-level component metadata rules'","typeGuard":null,"tryCatchPattern":"// under FAIL_ON_PROJECT_RULES the same condition throws; catch when applying\n// third-party plugins that register metadata rules at project scope\ntry {\n    project.dependencies.components.withModule(\"com.example:legacy\") { /* rule */ }\n} catch (e: org.gradle.api.InvalidUserCodeException) {\n    logger.warn(\"metadata rule suppressed by rulesMode: ${e.message}\")\n}","preventionTips":["Centralize component metadata rules in dependencyResolutionManagement { components { ... } } in settings.","The warning includes the rule's display name — grep for that name to find the declaring script or plugin.","Migrate rules before switching rulesMode, and use FAIL_ON_PROJECT_RULES temporarily to flush out hidden ones.","Re-check applied convention plugins after upgrades; they may add rules you forgot about."],"tags":["dependency-management","component-metadata-rules","prefer-settings","settings"],"backgroundTag":"repositories-mode-conflict","analyzedSha":"534f27719b66953f95cc907aae7f2c1b12f5482d","analyzedAt":"2026-08-22T08:09:12.375Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}