Unity-Technologies/UnityCsReference · error · ArgumentException
target must be valid
Error message
target must be valid
What it means
Thrown by GetTargetStringFrom(BuildTarget) when the BuildTarget equals BuildTarget.NoTarget. NoTarget is the sentinel for an unset/invalid target and cannot be mapped to a module name.
Source
Thrown at Editor/Mono/Modules/ModuleManager.cs:576
derivedBuildTargetProvider.RemoveDerivedBuildTargetExtension(platformGuid);
platformSupportModulesByGuid.Remove(platformGuid);
}
internal static string GetTargetStringFromBuildTarget(BuildTarget target)
{
return BuildTargetDiscovery.GetModuleNameForBuildTarget(target);
}
internal static string GetTargetStringFromBuildTargetGroup(BuildTargetGroup target)
{
return BuildTargetDiscovery.GetModuleNameForBuildTargetGroup(target);
}
// This function returns module name depending on the combination of targetGroup x target
internal static string GetTargetStringFrom(BuildTarget target)
{
if (target == BuildTarget.NoTarget)
throw new ArgumentException("target must be valid");
return GetTargetStringFromBuildTarget(target);
}
[Obsolete("ModuleManager.GetTargetStringFrom(BuildTargetGroup targetGroup, BuildTarget target) is deprecated, please use ModuleManager.GetTargetStringFrom(BuildTarget target)")]
internal static string GetTargetStringFrom(BuildTargetGroup targetGroup, BuildTarget target)
{
return GetTargetStringFrom(target);
}
internal static bool IsPlatformSupported(BuildTarget target)
{
return GetTargetStringFromBuildTarget(target) != null;
}
internal static string GetExtensionVersion(string target)
{
if (string.IsNullOrEmpty(target))View on GitHub (pinned to 225b0fbdb5)
Solutions
- Ensure the BuildTarget passed in is a concrete platform (e.g., StandaloneWindows64, Android).
- Validate the target at the call site: reject NoTarget before invoking GetTargetStringFrom.
- Initialize BuildTarget fields explicitly rather than relying on enum default.
Example fix
// before
string t = ModuleManager.GetTargetStringFrom(activeTarget); // activeTarget may be NoTarget
// after
if (activeTarget == BuildTarget.NoTarget)
throw new InvalidOperationException("Select a build target first.");
string t = ModuleManager.GetTargetStringFrom(activeTarget); Defensive patterns
Strategy: validation
Validate before calling
if (target != BuildTarget.NoTarget)
string s = ModuleManager.GetTargetStringFrom(target); Type guard
static bool IsValidBuildTarget(BuildTarget t) => t != BuildTarget.NoTarget;
Prevention
- Never pass uninitialized BuildTarget fields.
- Default to an explicit platform in build scripts.
- Validate target at the entry point of build helpers.
When it happens
Trigger: Passing BuildTarget.NoTarget (value 0) into ModuleManager.GetTargetStringFrom(BuildTarget). Often happens when a BuildTarget variable was never assigned or defaulted.
Common situations: Build pipeline invoked before a target was selected. BuildTarget parsed from an unset editor preference or a deserialized enum defaulting to 0 (NoTarget).
Related errors
- Cannot add dependency on invalid ArtifactKey.
- The object to add cannot be null.
- The object to remove cannot be null.
- Platform GUID {platformGuid} is not a valid Unity build plat
- rendererIDs and results NativeArrays don't match in length.
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/a4694859f378c361.
Report an issue: GitHub.