"""Build portable local UPM packages and update only ShrinkSDK dependencies in a consumer.""" import argparse, json, tarfile, shutil from pathlib import Path parser = argparse.ArgumentParser() parser.add_argument("consumer", type=Path) parser.add_argument("--messagepack", action="store_true", help="Requires MessagePack 3.x and its generator already installed in Unity") args = parser.parse_args() sdk = Path(__file__).resolve().parents[2] consumer = args.consumer.resolve() manifest_path = consumer / "Packages/manifest.json" manifest = json.loads(manifest_path.read_text(encoding="utf-8-sig")) catalog = {} for path in list((sdk / "Assets/Modules").glob("*/package.json")) + [sdk / "Assets/ShrinkInspection/package.json", sdk / "Assets/Modules/ShrinkNetwork/Adapters~/MessagePack/package.json"]: meta = json.loads(path.read_text(encoding="utf-8-sig")) catalog[meta["name"]] = (path.parent, meta) selected = set() def include(name): if name in selected: return if name not in catalog: raise ValueError("Missing local SDK package: " + name) selected.add(name) for dep in catalog[name][1].get("dependencies", {}): if dep.startswith("com.cneicy.shrink-"): include(dep) for name in manifest["dependencies"]: if name.startswith("com.cneicy.shrink-"): include(name) include("com.cneicy.shrink-inspection") if args.messagepack: include("com.cneicy.shrink-network-messagepack") output = consumer / "Packages/ShrinkSDK" output.mkdir(exist_ok=True) backup = sdk / "Artifacts/AgentSupport" / (consumer.name + "-manifest-before.json") backup.parent.mkdir(parents=True, exist_ok=True) if not backup.exists(): shutil.copy2(manifest_path, backup) excluded = {".git", ".vs", "bin", "obj", "node_modules", "Library", "Temp", "Development~"} for name in sorted(selected): root, meta = catalog[name] filename = name + "-" + meta["version"] + ".tgz" with tarfile.open(output / filename, "w:gz") as archive: for path in sorted(root.rglob("*")): relative = path.relative_to(root) if path.is_file() and not any(part in excluded for part in relative.parts) and not path.is_symlink(): archive.add(path, arcname="package/" + relative.as_posix(), recursive=False) manifest["dependencies"][name] = "file:ShrinkSDK/" + filename print(name, meta["version"]) manifest_path.write_text(json.dumps(manifest, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")