{"record":{"id":"04258f30d03dac21","repo":"microsoft/aspire","slug":"aspire-hosting-rust-requires-cargo-1-71-or-later-because","errorCode":null,"errorMessage":"Aspire.Hosting.Rust requires Cargo 1.71 or later because this 'cargo metadata' output does not include 'workspace_default_members'. Update the Rust toolchain and try again.","messagePattern":"Aspire\\.Hosting\\.Rust requires Cargo 1\\.71 or later because this 'cargo metadata' output does not include 'workspace_default_members'\\. Update the Rust toolchain and try again\\.","errorType":"exception","errorClass":"DistributedApplicationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Rust/CargoMetadata.cs","lineNumber":91,"sourceCode":"    /// </remarks>\n    public static CargoMetadata Parse(string json)\n    {\n        using var document = JsonDocument.Parse(json);\n        var root = document.RootElement;\n\n        var packages = new List<CargoPackage>();\n        if (root.TryGetProperty(\"packages\", out var packagesElement) && packagesElement.ValueKind == JsonValueKind.Array)\n        {\n            foreach (var packageElement in packagesElement.EnumerateArray())\n            {\n                packages.Add(ParsePackage(packageElement));\n            }\n        }\n\n        if (!root.TryGetProperty(\"workspace_default_members\", out var defaultMembersElement)\n            || defaultMembersElement.ValueKind != JsonValueKind.Array)\n        {\n            throw new DistributedApplicationException(\n                \"Aspire.Hosting.Rust requires Cargo 1.71 or later because this 'cargo metadata' output does not \" +\n                \"include 'workspace_default_members'. Update the Rust toolchain and try again.\");\n        }\n\n        return new CargoMetadata\n        {\n            Packages = packages,\n            DefaultMemberIds = ReadStringArray(defaultMembersElement),\n            TargetDirectory = root.TryGetProperty(\"target_directory\", out var targetDirectoryElement)\n                ? targetDirectoryElement.GetString() ?? string.Empty\n                : string.Empty\n        };\n    }\n\n    private static CargoPackage ParsePackage(JsonElement element)\n    {\n        var binTargets = new List<string>();\n        if (element.TryGetProperty(\"targets\", out var targetsElement) && targetsElement.ValueKind == JsonValueKind.Array)","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Rust/CargoMetadata.cs#L73-L109","documentation":"CargoMetadata.Parse reads the JSON output of 'cargo metadata' and requires the 'workspace_default_members' property (an array) to build the workspace model. If that property is missing or not an array, it throws DistributedApplicationException explaining that Cargo 1.71+ is required, since older cargo versions do not emit this field.","triggerScenarios":"Running Aspire.Hosting.Rust apphost startup where 'cargo metadata --format-version 1' output JSON lacks 'workspace_default_members' or has it as a non-array value — i.e. cargo older than 1.71 or unexpected output shape.","commonSituations":"Developers with an old Rust/cargo toolchain (pre-1.71) on PATH; CI images pinned to outdated Rust versions; a wrapper or shim emitting modified cargo metadata; corrupted or partial cargo output.","solutions":["Update the Rust toolchain: run 'rustup update stable' (or install 1.71+ via rustup) and verify with 'cargo --version'.","In CI, bump the Rust toolchain action/image to 1.71 or later.","Ensure the 'cargo' found on PATH is the rustup-managed one, not a distro package that is too old.","If output was intercepted by a wrapper, run 'cargo metadata --format-version 1' manually and compare against expected schema."],"exampleFix":"// shell\n// before\n$ cargo --version\n cargo 1.65.0\n\n// after\n$ rustup update stable\n$ cargo --version\n cargo 1.82.0","handlingStrategy":"validation","validationCode":"// Verify the toolchain before starting the apphost:\n$ cargo --version   # must be >= 1.71\n// or programmatically: parse 'cargo --version' output and compare minor version","typeGuard":null,"tryCatchPattern":"try { /* start Rust resource */ }\ncatch (DistributedApplicationException ex) when (ex.Message.Contains(\"workspace_default_members\"))\n{ /* instruct user to upgrade cargo */ }","preventionTips":["Pin Rust >= 1.71 in CI images and dev containers (rust-toolchain.toml).","Run 'rustup update' regularly so cargo stays current.","Ensure PATH resolves the rustup-managed cargo, not an outdated distro package."],"tags":["rust","cargo","version-compatibility"],"backgroundTag":"unsupported-operation","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}