44 lines
2.4 KiB
Python
44 lines
2.4 KiB
Python
"""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")
|