{"record":{"id":"ceb27b2e96bd5f8a","repo":"sgl-project/sglang","slug":"manifest-declares-python-module-python-module-r","errorCode":null,"errorMessage":"{manifest} declares python-module {python_module!r} but must also set `package.name` and `lib.name`","messagePattern":"(.+?) declares python-module (.+?) but must also set `package\\.name` and `lib\\.name`","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/rust_extensions/loader.py","lineNumber":177,"sourceCode":"        if manifest.name != \"Cargo.toml\":\n            continue\n        with manifest.open(\"rb\") as file:\n            document = tomllib.load(file)\n        package = document.get(\"package\")\n        if not isinstance(package, dict):\n            continue\n        sglang_metadata = package.get(\"metadata\", {}).get(\"sglang\", {})\n        declared_module = sglang_metadata.get(\"python-module\")\n        if declared_module is None:\n            continue\n        declared_modules.append(declared_module)\n        if declared_module != python_module:\n            continue\n\n        package_name = package.get(\"name\")\n        library = document.get(\"lib\", {}).get(\"name\")\n        if not package_name or not library:\n            raise ValueError(\n                f\"{manifest} declares python-module {python_module!r} but must \"\n                \"also set `package.name` and `lib.name`\"\n            )\n        matches.append(\n            _CrateSpec(\n                package=package_name,\n                library=library,\n                python_module=python_module,\n                workspace=workspace,\n                features=tuple(sglang_metadata.get(\"features\", ())),\n            )\n        )\n\n    if not matches:\n        raise ModuleNotFoundError(\n            f\"no Cargo package under {workspace} declares \"\n            f'`[package.metadata.sglang] python-module = \"{python_module}\"`; '\n            f\"declared modules: {sorted(declared_modules)}\",","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/rust_extensions/loader.py#L159-L195","documentation":"A Cargo manifest declares `[package.metadata.sglang] python-module` matching the requested module but omits `package.name` or `lib.name`, which the loader needs to locate the built library file.","triggerScenarios":"Adding a new Rust crate for a Python module with the sglang python-module metadata but leaving the manifest's package.name or [lib] name unset/empty.","commonSituations":"Hand-editing a new crate's Cargo.toml; template copy that drops fields; TOML typo like `lib.name` nested under the wrong table.","solutions":["Set both `package.name` and `lib.name` in the crate's Cargo.toml","Validate the manifest with `cargo metadata` or `tomllib` parsing","Copy a working sibling crate's Cargo.toml as template"],"exampleFix":"# before\n[package]\nname = \"\"\n[lib]\nname = \"\"\n[package.metadata.sglang]\npython-module = \"sglang._rust.x\"\n# after\n[package]\nname = \"sglang-rust-x\"\n[lib]\nname = \"sglang_rust_x\"\n[package.metadata.sglang]\npython-module = \"sglang._rust.x\"","handlingStrategy":"validation","validationCode":"import tomllib\nm = tomllib.loads(Path(manifest).read_text())\nassert m.get(\"package\",{}).get(\"name\") and m.get(\"lib\",{}).get(\"name\"), \"Cargo.toml needs package.name and lib.name\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Template new crates from a working sibling Cargo.toml","Lint sglang crates' manifests in CI"],"tags":["rust","cargo","manifest","validation"],"backgroundTag":"invalid-build-manifest","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}