dotnet: improve package fallbacks (#480456)

This commit is contained in:
David McFarland
2026-01-16 04:13:21 +00:00
committed by GitHub
6 changed files with 80 additions and 61 deletions
-5
View File
@@ -309,11 +309,6 @@
"version": "5.0.0",
"hash": "sha256-THQ8Z7DAoMDEqAS7feAmAt82NvU7H90Y+jYwC7NwL+0="
},
{
"pname": "Microsoft.AspNetCore.App.Internal.Assets",
"version": "10.0.2",
"hash": "sha256-nh+JRXHTI01RUDFeEw4yep4iMxci5R7zKyRX2Tkd/mc="
},
{
"pname": "Microsoft.AspNetCore.Authentication.JwtBearer",
"version": "10.0.1",
+62 -55
View File
@@ -100,71 +100,77 @@ let
# combine an SDK with the runtime/packages from a base SDK
combineSdk =
base: overlay:
if (overlay.runtime.version != base.runtime.version) then
throw "combineSdk: unable to combine ${overlay.name} with ${base.name} because runtime versions don't match (${overlay.runtime.version} != ${base.runtime.version})"
base: fallback:
if (fallback.runtime.version != base.runtime.version) then
throw "combineSdk: unable to combine ${fallback.name} with ${base.name} because runtime versions don't match (${fallback.runtime.version} != ${base.runtime.version})"
else if base.meta.broken then
fallback
else
pkgs.callPackage ./wrapper.nix { } "sdk" (
(pkgs.combinePackages [
base.runtime
base.aspnetcore
(overlay.overrideAttrs (old: {
passthru = old.passthru // {
inherit (base)
packages
targetPackages
;
};
}))
]).unwrapped.overrideAttrs
(old: {
name = overlay.unwrapped.name;
# resolve symlinks so DOTNET_ROOT is self-contained
postBuild = ''
mv "$out"/share/dotnet{,~}
cp -Lr "$out"/share/dotnet{~,}
rm -r "$out"/share/dotnet~
''
+ old.postBuild;
passthru =
old.passthru
// (
let
# if only overlay has a working ILCompiler, use it
hostRid = pkgs.systemToDotnetRid base.stdenv.hostPlatform.system;
hasILCompiler = base.hasILCompiler || overlay.hasILCompiler;
packageName = "runtime.${hostRid}.Microsoft.DotNet.ILCompiler";
packages =
if !base.hasILCompiler && overlay.hasILCompiler then
lib.filter (x: x.pname != packageName) base.packages
++ lib.filter (x: x.pname == packageName) overlay.packages
else
base.packages;
in
{
inherit hasILCompiler packages;
let
withBaseRuntimes =
if fallback.version == base.version then
base.unwrapped
else
(pkgs.combinePackages [
base.runtime
base.aspnetcore
fallback
]).unwrapped.overrideAttrs
(old: {
name = fallback.unwrapped.name;
# resolve symlinks so DOTNET_ROOT is self-contained
postBuild = ''
mv "$out"/share/dotnet{,~}
cp -Lr "$out"/share/dotnet{~,}
rm -r "$out"/share/dotnet~
''
+ old.postBuild;
passthru = old.passthru // {
inherit (base)
targetPackages
runtime
aspnetcore
;
inherit (overlay.unwrapped)
inherit (fallback.unwrapped)
pname
version
;
}
);
})
);
};
});
withFallbackPackages = withBaseRuntimes.overrideAttrs (old: {
passthru =
old.passthru
// (
let
hostRid = pkgs.systemToDotnetRid base.stdenv.hostPlatform.system;
hasILCompiler = base.hasILCompiler || fallback.hasILCompiler;
packageName = "runtime.${hostRid}.Microsoft.DotNet.ILCompiler";
mergePackages =
a: b:
let
names = lib.genAttrs' a (p: lib.nameValuePair p.pname null);
in
a ++ lib.filter (p: !lib.hasAttr p.pname names) b;
packages = mergePackages base.packages fallback.packages;
targetPackages = lib.mapAttrs (
name: value: mergePackages value fallback.targetPackages.${name}
) base.targetPackages;
in
{
inherit hasILCompiler packages targetPackages;
}
);
});
in
pkgs.callPackage ./wrapper.nix { } "sdk" withFallbackPackages;
in
pkgs
// rec {
# use binary SDK here to avoid downgrading feature band
sdk_8_0_1xx = if !pkgs.dotnet_8.vmr.meta.broken then pkgs.dotnet_8.sdk else pkgs.sdk_8_0_1xx-bin;
sdk_9_0_1xx = if !pkgs.dotnet_9.vmr.meta.broken then pkgs.dotnet_9.sdk else pkgs.sdk_9_0_1xx-bin;
sdk_10_0_1xx =
if !pkgs.dotnet_10.vmr.meta.broken then pkgs.dotnet_10.sdk else pkgs.sdk_10_0_1xx-bin;
sdk_8_0_1xx = combineSdk pkgs.dotnet_8.sdk pkgs.sdk_8_0_1xx-bin;
sdk_9_0_1xx = combineSdk pkgs.dotnet_9.sdk pkgs.sdk_9_0_1xx-bin;
sdk_10_0_1xx = combineSdk pkgs.dotnet_10.sdk pkgs.sdk_10_0_1xx-bin;
# source-built SDK only exists for _1xx feature band
# https://github.com/dotnet/source-build/issues/3667
sdk_8_0_4xx = combineSdk sdk_8_0_1xx pkgs.sdk_8_0_4xx-bin;
@@ -172,9 +178,10 @@ pkgs
sdk_8_0 = sdk_8_0_4xx;
sdk_9_0 = sdk_9_0_3xx;
sdk_10_0 = sdk_10_0_1xx;
sdk_8_0-source = sdk_8_0_1xx;
sdk_9_0-source = sdk_9_0_1xx;
sdk_10_0-source = sdk_10_0_1xx;
sdk_8_0-source = if !pkgs.dotnet_8.vmr.meta.broken then pkgs.dotnet_8.sdk else pkgs.sdk_8_0_1xx-bin;
sdk_9_0-source = if !pkgs.dotnet_9.vmr.meta.broken then pkgs.dotnet_9.sdk else pkgs.sdk_9_0_1xx-bin;
sdk_10_0-source =
if !pkgs.dotnet_10.vmr.meta.broken then pkgs.dotnet_10.sdk else pkgs.sdk_10_0_1xx-bin;
runtime_8_0 = sdk_8_0.runtime;
runtime_9_0 = sdk_9_0.runtime;
runtime_10_0 = sdk_10_0.runtime;
@@ -94,8 +94,10 @@ let
(mkPackage "Microsoft.DotNet.ILCompiler" runtime.version)
(mkPackage "Microsoft.NET.ILLink.Tasks" runtime.version)
(mkPackage "Microsoft.NETCore.App.Crossgen2.${hostRid}" runtime.version)
(mkPackage "runtime.${hostRid}.Microsoft.DotNet.ILCompiler" runtime.version)
]
++ lib.optional vmr.hasILCompiler (
mkPackage "runtime.${hostRid}.Microsoft.DotNet.ILCompiler" runtime.version
)
++ lib.optionals (lib.versionOlder runtime.version "9") [
(mkPackage "Microsoft.NETCore.DotNetHost" runtime.version)
(mkPackage "Microsoft.NETCore.DotNetHostPolicy" runtime.version)
@@ -114,6 +116,9 @@ let
(mkPackage "runtime.${targetRid}.Microsoft.NETCore.DotNetHost" runtime.version)
(mkPackage "runtime.${targetRid}.Microsoft.NETCore.DotNetHostPolicy" runtime.version)
(mkPackage "runtime.${targetRid}.Microsoft.NETCore.DotNetHostResolver" runtime.version)
]
++ lib.optionals (lib.versionAtLeast runtime.version "10") [
(mkPackage "Microsoft.NETCore.App.Runtime.NativeAOT.${targetRid}" runtime.version)
];
};
@@ -128,6 +128,12 @@ aspnetcore_packages () {
Microsoft.AspNetCore.App.Ref
)
if versionAtLeast "$version" 10; then
pkgs+=(
Microsoft.AspNetCore.App.Internal.Assets
)
fi
generate_package_list "$version" ' ' "${pkgs[@]}"
}
@@ -14,6 +14,11 @@ let
version = "10.0.2";
hash = "sha512-MeDkxsB9ir694B2z0nIG7ZZ6DISLmbU7aOwCusO6AadYjitxjv+e9TuY1Y0ijwuYNjxukBIj45nF/fCEg6CGHw==";
})
(fetchNupkg {
pname = "Microsoft.AspNetCore.App.Internal.Assets";
version = "10.0.2";
hash = "sha512-v9Au9ZSo3ZOe77StttCPCtOZkY7xSFXSyyWMR9Y0Kx3ZKegVp4zg7TJwz4osTgQp7EKyXlbDpvjUbgly51XbmA==";
})
(fetchNupkg {
pname = "Microsoft.NETCore.DotNetAppHost";
version = "10.0.2";
@@ -33,6 +33,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
license
maintainers
platforms
broken
;
};