From a8e88a1be440042dfcecfd7350b9ac714e095e0e Mon Sep 17 00:00:00 2001 From: qzylinra Date: Wed, 22 Oct 2025 08:41:27 +0800 Subject: [PATCH] buildDartApplication: add workspace-package-config.py --- .../hooks/dart-config-hook.sh | 3 ++ .../build-dart-application/hooks/default.nix | 1 + .../workspace-package-config.py | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 pkgs/build-support/dart/build-dart-application/workspace-package-config.py diff --git a/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh b/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh index 56f20a4f63a3..80fef886e122 100644 --- a/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh +++ b/pkgs/build-support/dart/build-dart-application/hooks/dart-config-hook.sh @@ -9,6 +9,9 @@ dartConfigHook() { echo "Installing dependencies" mkdir -p .dart_tool cp "$packageConfig" .dart_tool/package_config.json + chmod u+w .dart_tool/package_config.json + @python3@ @workspacePackageConfigScript@ + chmod u-w .dart_tool/package_config.json @python3@ @packageGraphScript@ > .dart_tool/package_graph.json packagePath() { diff --git a/pkgs/build-support/dart/build-dart-application/hooks/default.nix b/pkgs/build-support/dart/build-dart-application/hooks/default.nix index 64f1019f882f..a22db27f4d97 100644 --- a/pkgs/build-support/dart/build-dart-application/hooks/default.nix +++ b/pkgs/build-support/dart/build-dart-application/hooks/default.nix @@ -14,6 +14,7 @@ substitutions.jq = "${jq}/bin/jq"; substitutions.python3 = lib.getExe (python3.withPackages (ps: with ps; [ pyyaml ])); substitutions.packageGraphScript = ../../pub2nix/package-graph.py; + substitutions.workspacePackageConfigScript = ../workspace-package-config.py; } ./dart-config-hook.sh; dartBuildHook = makeSetupHook { name = "dart-build-hook"; diff --git a/pkgs/build-support/dart/build-dart-application/workspace-package-config.py b/pkgs/build-support/dart/build-dart-application/workspace-package-config.py new file mode 100644 index 000000000000..7d7d00988f9a --- /dev/null +++ b/pkgs/build-support/dart/build-dart-application/workspace-package-config.py @@ -0,0 +1,42 @@ +import json +import re +from pathlib import Path + +import yaml + + +def main() -> None: + with Path("pubspec.yaml").open("r", encoding="utf-8") as f: + pubspec = yaml.load(f, Loader=yaml.CSafeLoader) + if not pubspec.get("workspace"): + return + with Path(".dart_tool/package_config.json").open("r", encoding="utf-8") as f: + package_config = json.load(f) + for package_path in pubspec.get("workspace", []): + with (Path(package_path) / "pubspec.yaml").open("r", encoding="utf-8") as f: + package_pubspec = yaml.load(f, Loader=yaml.CSafeLoader) + m = re.match( + r"^[ \t]*(\^|>=|>)?[ \t]*([0-9]+\.[0-9]+)\.[0-9]+.*$", + package_pubspec.get("environment", {}).get("sdk", ""), + ) + if m: + languageVersion = m.group(2) + elif package_pubspec.get("environment", {}).get("sdk") == "any": + languageVersion = "null" + else: + languageVersion = "2.7" + if not any( + pkg["name"] == package_pubspec["name"] for pkg in package_config["packages"] + ): + package_config["packages"].append({ + "name": package_pubspec["name"], + "rootUri": Path(package_path).resolve().as_uri(), + "packageUri": "lib/", + "languageVersion": languageVersion, + }) + with Path(".dart_tool/package_config.json").open("w", encoding="utf-8") as f: + json.dump(package_config, f, sort_keys=True, indent=4) + + +if __name__ == "__main__": + main()