{"record":{"id":"ded5a689b2ea83f4","repo":"Unity-Technologies/UnityCsReference","slug":"there-is-no-a-valid-namedbuildtarget-for-buildtarg","errorCode":null,"errorMessage":"There is no a valid NamedBuildTarget for BuildTargetGroup '{buildTargetGroup}'","messagePattern":"There is no a valid NamedBuildTarget for BuildTargetGroup '(.+?)'","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"Editor/Mono/BuildPipeline/NamedBuildTarget.cs","lineNumber":160,"sourceCode":"                case BuildTargetGroup.LinuxHeadlessSimulation:\n                    return NamedBuildTarget.LinuxHeadlessSimulation;\n                case BuildTargetGroup.EmbeddedLinux:\n                    return NamedBuildTarget.EmbeddedLinux;\n                case BuildTargetGroup.QNX:\n                    return NamedBuildTarget.QNX;\n\n                // Build targets that are not explicitly listed\n                case BuildTargetGroup.GameCoreXboxSeries:\n                    return new NamedBuildTarget(\"GameCoreScarlett\");\n                case BuildTargetGroup.GameCoreXboxOne:\n                    return new NamedBuildTarget(\"GameCoreXboxOne\");\n                case BuildTargetGroup.PS5:\n                    return new NamedBuildTarget(\"PS5\");\n                case BuildTargetGroup.Kepler:\n                    return new NamedBuildTarget(\"Kepler\");\n            }\n\n            throw new ArgumentException($\"There is no a valid NamedBuildTarget for BuildTargetGroup '{buildTargetGroup}'\");\n        }\n\n        // TODO: We shouldn't be assuming that the namedBuildTarget can be extracted from the\n        // active settings. This should be passed through the callstack instead when building.\n        // We will need to use BuildTargetSelection (BuildTarget + Subtarget) that is in the cpp side.\n        // For now this fixes an issue where Dedicated Server compiles with the Standalone settings.\n        internal static NamedBuildTarget FromActiveSettings(BuildTarget target)\n        {\n            var buildTargetGroup = BuildPipeline.GetBuildTargetGroup(target);\n\n            if (buildTargetGroup == BuildTargetGroup.Standalone && (StandaloneBuildSubtarget)EditorUserBuildSettings.GetActiveSubtargetFor(target) == StandaloneBuildSubtarget.Server)\n            {\n                return NamedBuildTarget.Server;\n            }\n\n            return NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup);\n        }\n","sourceCodeStart":142,"sourceCodeEnd":178,"githubUrl":"https://github.com/Unity-Technologies/UnityCsReference/blob/225b0fbdb57cc17d094e8056b71f8314aba56f73/Editor/Mono/BuildPipeline/NamedBuildTarget.cs#L142-L178","documentation":"FromBuildTargetGroup throws when the supplied BuildTargetGroup has no mapping in its switch statement. Each group must be explicitly handled; an unmapped group means Unity has no canonical NamedBuildTarget for it.","triggerScenarios":"Calling NamedBuildTarget.FromBuildTargetGroup(buildTargetGroup) with a group not covered by the switch (e.g. an Unknown, deprecated, or newly added BuildTargetGroup enum value before the mapping is updated).","commonSituations":"A new platform module registers a BuildTargetGroup enum value but the NamedBuildTarget mapping wasn't updated in lockstep; calling with BuildTargetGroup.Unknown; reflection/introspection iterating all enum values.","solutions":["Avoid calling FromBuildTargetGroup for unsupported/Unknown groups; branch on the known set first.","Prefer NamedBuildTarget.FromActiveSettings(BuildTarget) which has Standalone subtarget handling, instead of the raw group mapping.","If the group is genuinely new, add an explicit case to FromBuildTargetGroup returning its canonical NamedBuildTarget."],"exampleFix":"// before\nvar nbt = NamedBuildTarget.FromBuildTargetGroup(someGroup); // may throw\n\n// after\nif (someGroup == BuildTargetGroup.Unknown)\n    throw new ArgumentException(\"Cannot resolve NamedBuildTarget for Unknown group.\");\nvar nbt = NamedBuildTarget.FromBuildTargetGroup(someGroup);","handlingStrategy":"validation","validationCode":"switch (buildTargetGroup)\n{\n    case BuildTargetGroup.Unknown:\n        throw new ArgumentException(\"Cannot resolve NamedBuildTarget for Unknown group.\");\n    // ... add explicit handling for known groups ...\n}","typeGuard":"static bool IsResolvableGroup(BuildTargetGroup g) => g switch {\n    BuildTargetGroup.Standalone => true,\n    BuildTargetGroup.Android => true,\n    BuildTargetGroup.iOS => true,\n    // enumerate the handled cases\n    _ => false };\nif (!IsResolvableGroup(group)) return null;","tryCatchPattern":null,"preventionTips":["Prefer NamedBuildTarget.FromActiveSettings(target) over FromBuildTargetGroup.","Branch on the known group set before calling FromBuildTargetGroup."],"tags":["named-build-target","build-target-group","build-pipeline","validation"],"backgroundTag":null,"analyzedSha":"225b0fbdb57cc17d094e8056b71f8314aba56f73","analyzedAt":"2026-08-13T19:07:19.849Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}