kind of dependency resolver
All checks were successful
Build / Compute Version (push) Successful in 7s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 31s
Build / Build Nuget package (NuGet) (push) Successful in 41s
Build / Build Nuget package (CringePlugins) (push) Successful in 54s
Build / Build Launcher (push) Successful in 1m37s
Build / Build Nuget package (SharedCringe) (push) Successful in 6m2s
All checks were successful
Build / Compute Version (push) Successful in 7s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 31s
Build / Build Nuget package (NuGet) (push) Successful in 41s
Build / Build Nuget package (CringePlugins) (push) Successful in 54s
Build / Build Launcher (push) Successful in 1m37s
Build / Build Nuget package (SharedCringe) (push) Successful in 6m2s
right now plugin to plugin dependencies are not supported
This commit is contained in:
@@ -18,18 +18,10 @@
|
|||||||
"NuGet.Versioning": "6.12.1"
|
"NuGet.Versioning": "6.12.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Basic.Reference.Assemblies.Net80": {
|
"Basic.Reference.Assemblies.Net90": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "1.7.9",
|
"resolved": "1.7.9",
|
||||||
"contentHash": "1wbS9ZJLFVrKD2jqv27gekIrpjpLffR9sitLQh5drWoG9KbyR/CgrAhw5I0c8Eq3zFMOToCmrpZi3VpRoInCgg==",
|
"contentHash": "9CUkU6Z17tJL/cQc6FeZL0qfQf4CBaNpSBqFL6CTmrIC8827x7NEPyNq/inZA/r6Y5ziWo2Yd8caMxLPqDUpeA==",
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Basic.Reference.Assemblies.Net80Windows": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "1.7.9",
|
|
||||||
"contentHash": "98GFm8MC+pv37rTHaxBm5KFucqdJj0jK0XRHSGt2sXK9HNqtGImIFCFahxjUzskQjiUkPAzVhTou2OYZOuhhEg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
||||||
}
|
}
|
||||||
@@ -70,8 +62,8 @@
|
|||||||
},
|
},
|
||||||
"Microsoft.CodeAnalysis.Common": {
|
"Microsoft.CodeAnalysis.Common": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "4.11.0",
|
"resolved": "4.12.0",
|
||||||
"contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==",
|
"contentHash": "c1kNYihL2gdcuU1dqm8R8YeA4YkB43TpU3pa2r66Uooh6AAhRtENzj9A4Kj0a+H8JDDyuTjNZql9XlVUzV+UjA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
||||||
"System.Collections.Immutable": "8.0.0",
|
"System.Collections.Immutable": "8.0.0",
|
||||||
@@ -80,11 +72,11 @@
|
|||||||
},
|
},
|
||||||
"Microsoft.CodeAnalysis.CSharp": {
|
"Microsoft.CodeAnalysis.CSharp": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "4.11.0",
|
"resolved": "4.12.0",
|
||||||
"contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==",
|
"contentHash": "30vVQ1MizeC22iEdEvI2w0eTIYG43/L20yBzuQH01xKzJgHAoWehzI2F8u07o4mXh4DGMOjQF7aEm0zzvsG3Mg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
||||||
"Microsoft.CodeAnalysis.Common": "[4.11.0]",
|
"Microsoft.CodeAnalysis.Common": "[4.12.0]",
|
||||||
"System.Collections.Immutable": "8.0.0",
|
"System.Collections.Immutable": "8.0.0",
|
||||||
"System.Reflection.Metadata": "8.0.0"
|
"System.Reflection.Metadata": "8.0.0"
|
||||||
}
|
}
|
||||||
@@ -339,11 +331,10 @@
|
|||||||
"cringelauncher": {
|
"cringelauncher": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Basic.Reference.Assemblies.Net80": "[1.7.9, )",
|
"Basic.Reference.Assemblies.Net90": "[1.7.9, )",
|
||||||
"Basic.Reference.Assemblies.Net80Windows": "[1.7.9, )",
|
|
||||||
"CringeBootstrap.Abstractions": "[1.0.0, )",
|
"CringeBootstrap.Abstractions": "[1.0.0, )",
|
||||||
"CringePlugins": "[1.0.0, )",
|
"CringePlugins": "[1.0.0, )",
|
||||||
"Microsoft.CodeAnalysis.CSharp": "[4.11.0, )",
|
"Microsoft.CodeAnalysis.CSharp": "[4.12.0, )",
|
||||||
"NLog": "[5.3.4, )",
|
"NLog": "[5.3.4, )",
|
||||||
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
||||||
"Steamworks.NET": "[20.1.0, )",
|
"Steamworks.NET": "[20.1.0, )",
|
||||||
|
@@ -22,10 +22,9 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Basic.Reference.Assemblies.Net80" Version="1.7.9" />
|
<PackageReference Include="Basic.Reference.Assemblies.Net90" Version="1.7.9" />
|
||||||
<PackageReference Include="Basic.Reference.Assemblies.Net80Windows" Version="1.7.9" />
|
|
||||||
<PackageReference Include="dnlib" Version="4.4.0" />
|
<PackageReference Include="dnlib" Version="4.4.0" />
|
||||||
<PackageReference Include="Krafs.Publicizer" Version="2.2.1">
|
<PackageReference Include="Krafs.Publicizer" Version="2.3.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
@@ -39,7 +38,7 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="NLog" Version="5.3.4" />
|
<PackageReference Include="NLog" Version="5.3.4" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.11.0" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
|
||||||
<PackageReference Include="SpaceEngineersDedicated.ReferenceAssemblies" Version="1.*" ExcludeAssets="runtime" />
|
<PackageReference Include="SpaceEngineersDedicated.ReferenceAssemblies" Version="1.*" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Steamworks.NET" Version="20.1.0" />
|
<PackageReference Include="Steamworks.NET" Version="20.1.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@@ -2,20 +2,11 @@
|
|||||||
"version": 1,
|
"version": 1,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"net9.0-windows10.0.19041": {
|
"net9.0-windows10.0.19041": {
|
||||||
"Basic.Reference.Assemblies.Net80": {
|
"Basic.Reference.Assemblies.Net90": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[1.7.9, )",
|
"requested": "[1.7.9, )",
|
||||||
"resolved": "1.7.9",
|
"resolved": "1.7.9",
|
||||||
"contentHash": "1wbS9ZJLFVrKD2jqv27gekIrpjpLffR9sitLQh5drWoG9KbyR/CgrAhw5I0c8Eq3zFMOToCmrpZi3VpRoInCgg==",
|
"contentHash": "9CUkU6Z17tJL/cQc6FeZL0qfQf4CBaNpSBqFL6CTmrIC8827x7NEPyNq/inZA/r6Y5ziWo2Yd8caMxLPqDUpeA==",
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Basic.Reference.Assemblies.Net80Windows": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[1.7.9, )",
|
|
||||||
"resolved": "1.7.9",
|
|
||||||
"contentHash": "98GFm8MC+pv37rTHaxBm5KFucqdJj0jK0XRHSGt2sXK9HNqtGImIFCFahxjUzskQjiUkPAzVhTou2OYZOuhhEg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
||||||
}
|
}
|
||||||
@@ -28,18 +19,18 @@
|
|||||||
},
|
},
|
||||||
"Krafs.Publicizer": {
|
"Krafs.Publicizer": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[2.2.1, )",
|
"requested": "[2.3.0, )",
|
||||||
"resolved": "2.2.1",
|
"resolved": "2.3.0",
|
||||||
"contentHash": "QGI4nMGQbKsuFUUboixVHu4mv3lHB5RejIa7toIlzTmwLkuCYYEpUBJjmy3OpXYyj5dVSZAXVbr4oeMSloE67Q=="
|
"contentHash": "DjktTgctwxUMhMkWKrRECer3LR1lHzanCOlE4mpinAiY8SfWJq4DG/QitP5h1A+WBjyWHzQSOG+204i3VpO1FA=="
|
||||||
},
|
},
|
||||||
"Microsoft.CodeAnalysis.CSharp": {
|
"Microsoft.CodeAnalysis.CSharp": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[4.11.0, )",
|
"requested": "[4.12.0, )",
|
||||||
"resolved": "4.11.0",
|
"resolved": "4.12.0",
|
||||||
"contentHash": "6XYi2EusI8JT4y2l/F3VVVS+ISoIX9nqHsZRaG6W5aFeJ5BEuBosHfT/ABb73FN0RZ1Z3cj2j7cL28SToJPXOw==",
|
"contentHash": "30vVQ1MizeC22iEdEvI2w0eTIYG43/L20yBzuQH01xKzJgHAoWehzI2F8u07o4mXh4DGMOjQF7aEm0zzvsG3Mg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
||||||
"Microsoft.CodeAnalysis.Common": "[4.11.0]",
|
"Microsoft.CodeAnalysis.Common": "[4.12.0]",
|
||||||
"System.Collections.Immutable": "8.0.0",
|
"System.Collections.Immutable": "8.0.0",
|
||||||
"System.Reflection.Metadata": "8.0.0"
|
"System.Reflection.Metadata": "8.0.0"
|
||||||
}
|
}
|
||||||
@@ -160,8 +151,8 @@
|
|||||||
},
|
},
|
||||||
"Microsoft.CodeAnalysis.Common": {
|
"Microsoft.CodeAnalysis.Common": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "4.11.0",
|
"resolved": "4.12.0",
|
||||||
"contentHash": "djf8ujmqYImFgB04UGtcsEhHrzVqzHowS+EEl/Yunc5LdrYrZhGBWUTXoCF0NzYXJxtfuD+UVQarWpvrNc94Qg==",
|
"contentHash": "c1kNYihL2gdcuU1dqm8R8YeA4YkB43TpU3pa2r66Uooh6AAhRtENzj9A4Kj0a+H8JDDyuTjNZql9XlVUzV+UjA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
|
||||||
"System.Collections.Immutable": "8.0.0",
|
"System.Collections.Immutable": "8.0.0",
|
||||||
|
@@ -22,14 +22,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Basic.Reference.Assemblies.Net80" Version="1.7.9" PrivateAssets="all" />
|
<PackageReference Include="Basic.Reference.Assemblies.Net90" Version="1.7.9" PrivateAssets="all" />
|
||||||
<PackageReference Include="Basic.Reference.Assemblies.Net80Windows" Version="1.7.9" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="NLog" Version="5.3.4" />
|
<PackageReference Include="NLog" Version="5.3.4" />
|
||||||
<PackageReference Include="Lib.Harmony.Thin" Version="2.3.4-torch" />
|
<PackageReference Include="Lib.Harmony.Thin" Version="2.3.4-torch" />
|
||||||
<PackageReference Include="ImGui.NET.DirectX" Version="1.91.0.1" />
|
<PackageReference Include="ImGui.NET.DirectX" Version="1.91.0.1" />
|
||||||
<PackageReference Include="SpaceEngineersDedicated.ReferenceAssemblies" Version="1.*" ExcludeAssets="runtime" />
|
<PackageReference Include="SpaceEngineersDedicated.ReferenceAssemblies" Version="1.*" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="dnlib" Version="4.4.0" />
|
<PackageReference Include="dnlib" Version="4.4.0" />
|
||||||
<PackageReference Include="Krafs.Publicizer" Version="2.2.1">
|
<PackageReference Include="Krafs.Publicizer" Version="2.3.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
@@ -25,7 +25,7 @@ public class PluginsLifetime(string gameFolder) : ILoadingStage
|
|||||||
|
|
||||||
private ImmutableArray<PluginInstance> _plugins = [];
|
private ImmutableArray<PluginInstance> _plugins = [];
|
||||||
private readonly DirectoryInfo _dir = Directory.CreateDirectory(Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher"));
|
private readonly DirectoryInfo _dir = Directory.CreateDirectory(Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CringeLauncher"));
|
||||||
private readonly NuGetFramework _runtimeFramework = NuGetFramework.ParseFolder("net8.0-windows10.0.19041.0");
|
private readonly NuGetFramework _runtimeFramework = NuGetFramework.ParseFolder("net9.0-windows10.0.19041.0");
|
||||||
|
|
||||||
public async ValueTask Load(ISplashProgress progress)
|
public async ValueTask Load(ISplashProgress progress)
|
||||||
{
|
{
|
||||||
@@ -89,35 +89,40 @@ public class PluginsLifetime(string gameFolder) : ILoadingStage
|
|||||||
Contexts = contextBuilder.ToImmutable();
|
Contexts = contextBuilder.ToImmutable();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task LoadPlugins(IReadOnlySet<CachedPackage> packages, PackageSourceMapping sourceMapping,
|
private async Task LoadPlugins(IReadOnlyCollection<CachedPackage> packages, PackageSourceMapping sourceMapping,
|
||||||
PackagesConfig packagesConfig)
|
PackagesConfig packagesConfig)
|
||||||
{
|
{
|
||||||
var plugins = _plugins.ToBuilder();
|
var plugins = _plugins.ToBuilder();
|
||||||
|
|
||||||
var packageVersions = BuiltInPackages.GetPackages(_runtimeFramework)
|
var builtInPackages = BuiltInPackages.GetPackages(_runtimeFramework)
|
||||||
.ToImmutableDictionary(b => b.Package.Id, b => b.Package.Version,
|
.ToImmutableDictionary(package => package.Package.Id);
|
||||||
StringComparer.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
packageVersions = packageVersions.AddRange(packages.Select(b =>
|
var resolvedPackages = builtInPackages.ToDictionary();
|
||||||
new KeyValuePair<string, NuGetVersion>(b.Package.Id, b.Package.Version)));
|
foreach (var package in packages)
|
||||||
|
{
|
||||||
|
resolvedPackages.TryAdd(package.Package.Id, package);
|
||||||
|
}
|
||||||
|
|
||||||
var manifestBuilder = new DependencyManifestBuilder(_dir.CreateSubdirectory("cache"), sourceMapping,
|
var manifestBuilder = new DependencyManifestBuilder(_dir.CreateSubdirectory("cache"), sourceMapping,
|
||||||
dependency => packageVersions.TryGetValue(dependency.Id, out var version) && version.Major != 99
|
dependency =>
|
||||||
? version
|
{
|
||||||
: dependency.Range.MinVersion ?? dependency.Range.MaxVersion);
|
resolvedPackages.TryGetValue(dependency.Id, out var package);
|
||||||
|
return package?.Entry;
|
||||||
|
});
|
||||||
|
|
||||||
foreach (var package in packages)
|
foreach (var package in packages)
|
||||||
{
|
{
|
||||||
|
if (builtInPackages.ContainsKey(package.Package.Id)) continue;
|
||||||
|
|
||||||
var dir = Path.Join(package.Directory.FullName, "lib", package.ResolvedFramework.GetShortFolderName());
|
var dir = Path.Join(package.Directory.FullName, "lib", package.ResolvedFramework.GetShortFolderName());
|
||||||
|
|
||||||
var path = Path.Join(dir, $"{package.Package.Id}.deps.json");
|
var path = Path.Join(dir, $"{package.Package.Id}.deps.json");
|
||||||
if (!File.Exists(path))
|
if (!File.Exists(path))
|
||||||
{
|
{
|
||||||
await using (var stream = File.Create(path))
|
await using var stream = File.Create(path);
|
||||||
await manifestBuilder.WriteDependencyManifestAsync(stream, package.Entry, _runtimeFramework);
|
await manifestBuilder.WriteDependencyManifestAsync(stream, package.Entry, _runtimeFramework);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var client = await sourceMapping.GetClientAsync(package.Package.Id);
|
var client = await sourceMapping.GetClientAsync(package.Package.Id);
|
||||||
var sourceName = packagesConfig.Sources.First(b => b.Url == client.ToString()).Name;
|
var sourceName = packagesConfig.Sources.First(b => b.Url == client.ToString()).Name;
|
||||||
LoadComponent(plugins, Path.Join(dir, $"{package.Package.Id}.dll"),
|
LoadComponent(plugins, Path.Join(dir, $"{package.Package.Id}.dll"),
|
||||||
|
@@ -41,14 +41,14 @@ public static class BuiltInPackages
|
|||||||
var version = attribute is null ? new(99, 0, 0) : NuGetVersion.Parse((string)attribute.ConstructorArguments[0].Value);
|
var version = attribute is null ? new(99, 0, 0) : NuGetVersion.Parse((string)attribute.ConstructorArguments[0].Value);
|
||||||
|
|
||||||
return new BuiltInSdkPackage(
|
return new BuiltInSdkPackage(
|
||||||
new(0, Path.GetFileNameWithoutExtension(r.FileName), version, []), runtimeFramework,
|
new(0, Path.GetFileNameWithoutExtension(r.FileName), version), runtimeFramework,
|
||||||
new(Path.GetFileNameWithoutExtension(r.FileName), version, [new(runtimeFramework, [])], null, []));
|
new(Path.GetFileNameWithoutExtension(r.FileName), version, [new(runtimeFramework, [])], null, []));
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
[
|
[
|
||||||
..Net80.ReferenceInfos.AllValues.Select(MapSdkPackage),
|
..Net90.ReferenceInfos.AllValues.Select(MapSdkPackage),
|
||||||
..Net80Windows.ReferenceInfos.AllValues.Select(MapSdkPackage),
|
// ..Net80Windows.ReferenceInfos.AllValues.Select(MapSdkPackage),
|
||||||
nlog,
|
nlog,
|
||||||
se,
|
se,
|
||||||
imGui,
|
imGui,
|
||||||
@@ -72,7 +72,7 @@ public static class BuiltInPackages
|
|||||||
dependencies ??= [];
|
dependencies ??= [];
|
||||||
|
|
||||||
return new(
|
return new(
|
||||||
new(0, id, version, [..dependencies.Value.Select(b => b.Id)]),
|
new(0, id, version),
|
||||||
runtimeFramework,
|
runtimeFramework,
|
||||||
new(id, version, [
|
new(id, version, [
|
||||||
new(runtimeFramework, dependencies.Value)
|
new(runtimeFramework, dependencies.Value)
|
||||||
|
@@ -11,7 +11,7 @@ namespace CringePlugins.Resolver;
|
|||||||
public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<PackageReference> references, PackageSourceMapping packageSources)
|
public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<PackageReference> references, PackageSourceMapping packageSources)
|
||||||
{
|
{
|
||||||
private static readonly ILogger Log = LogManager.GetCurrentClassLogger();
|
private static readonly ILogger Log = LogManager.GetCurrentClassLogger();
|
||||||
public async Task<ImmutableHashSet<ResolvedPackage>> ResolveAsync()
|
public async Task<ImmutableSortedSet<ResolvedPackage>> ResolveAsync()
|
||||||
{
|
{
|
||||||
var order = 0;
|
var order = 0;
|
||||||
var packages = new SortedDictionary<Package, CatalogEntry>();
|
var packages = new SortedDictionary<Package, CatalogEntry>();
|
||||||
@@ -41,9 +41,11 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
if (version is null)
|
if (version is null)
|
||||||
throw new Exception($"Unable to find version for package {reference.Id}");
|
throw new Exception($"Unable to find version for package {reference.Id}");
|
||||||
|
|
||||||
var package = new Package(order, reference.Id, version, []); // todo resolve dependencies
|
var catalogEntry = items[version].CatalogEntry;
|
||||||
|
|
||||||
if (packages.TryAdd(package, items[version].CatalogEntry))
|
var package = new Package(order, reference.Id, version);
|
||||||
|
|
||||||
|
if (packages.TryAdd(package, catalogEntry))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!packages.TryGetValue(package, out _))
|
if (!packages.TryGetValue(package, out _))
|
||||||
@@ -61,10 +63,10 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
packages.Add(package with
|
packages.Add(package with
|
||||||
{
|
{
|
||||||
Order = ++order
|
Order = ++order
|
||||||
}, items[version].CatalogEntry);
|
}, catalogEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
var set = ImmutableHashSet<ResolvedPackage>.Empty.ToBuilder();
|
var set = ImmutableSortedSet<ResolvedPackage>.Empty.ToBuilder();
|
||||||
foreach (var (package, catalogEntry) in packages)
|
foreach (var (package, catalogEntry) in packages)
|
||||||
{
|
{
|
||||||
var client = await packageSources.GetClientAsync(package.Id);
|
var client = await packageSources.GetClientAsync(package.Id);
|
||||||
@@ -81,6 +83,78 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
set.Add(new RemotePackage(package, nearestGroup.TargetFramework, client, catalogEntry));
|
set.Add(new RemotePackage(package, nearestGroup.TargetFramework, client, catalogEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < set.Count; i++)
|
||||||
|
{
|
||||||
|
if (set[i] is not RemotePackage package) continue;
|
||||||
|
|
||||||
|
var dependencies = package.Entry.DependencyGroups
|
||||||
|
?.Single(b => b.TargetFramework == package.ResolvedFramework)?.Dependencies ??
|
||||||
|
[];
|
||||||
|
|
||||||
|
foreach (var (id, versionRange) in dependencies)
|
||||||
|
{
|
||||||
|
var client = await packageSources.GetClientAsync(id);
|
||||||
|
|
||||||
|
RegistrationRoot? registrationRoot;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
registrationRoot = await client.GetPackageRegistrationRootAsync(id);
|
||||||
|
}
|
||||||
|
catch (HttpRequestException ex)
|
||||||
|
{
|
||||||
|
throw new Exception($"Failed to resolve dependency {id} for {package.Package}", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
var items = registrationRoot.Items.SelectMany(page => page.Items!)
|
||||||
|
.ToImmutableDictionary(b => b.CatalogEntry.Version);
|
||||||
|
|
||||||
|
var version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().FirstOrDefault(b => versionRange.Satisfies(b));
|
||||||
|
|
||||||
|
if (version is null)
|
||||||
|
throw new Exception($"Unable to find version for package {id} as dependency of {package.Package}");
|
||||||
|
|
||||||
|
var catalogEntry = items[version].CatalogEntry;
|
||||||
|
|
||||||
|
var dependencyPackage = new Package(i, id, version);
|
||||||
|
|
||||||
|
if (packages.TryGetValue(dependencyPackage, out var existingPackage))
|
||||||
|
{
|
||||||
|
if (dependencyPackage.Version < existingPackage.Version)
|
||||||
|
{
|
||||||
|
// dependency has lower version than already resolved
|
||||||
|
// need to check if existing fits the version range
|
||||||
|
// and reorder existing to ensure it's ordered before requesting package
|
||||||
|
|
||||||
|
if (!versionRange.Satisfies(existingPackage.Version))
|
||||||
|
throw new Exception(
|
||||||
|
$"Incompatible package version {dependencyPackage} (required by {package.Package}) from {existingPackage}");
|
||||||
|
|
||||||
|
if (dependencyPackage.CompareTo(existingPackage) < 0)
|
||||||
|
{
|
||||||
|
packages.Remove(dependencyPackage);
|
||||||
|
packages.Add(dependencyPackage, existingPackage);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception($"Detected package downgrade from {existingPackage} to {dependencyPackage} as dependency of {package.Package}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!packages.TryAdd(dependencyPackage, catalogEntry))
|
||||||
|
throw new Exception($"Duplicate package {dependencyPackage.Id}");
|
||||||
|
|
||||||
|
var nearestGroup = NuGetFrameworkUtility.GetNearest(catalogEntry.DependencyGroups ?? [], runtimeFramework,
|
||||||
|
g => g.TargetFramework);
|
||||||
|
|
||||||
|
if (nearestGroup is null)
|
||||||
|
throw new Exception($"Unable to find compatible dependency group for {dependencyPackage} as dependency of {package.Package}");
|
||||||
|
|
||||||
|
set.Add(new RemoteDependencyPackage(dependencyPackage, nearestGroup.TargetFramework, client, package, catalogEntry));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return set.ToImmutable();
|
return set.ToImmutable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,9 +201,40 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
public record CachedPackage(Package Package, NuGetFramework ResolvedFramework, DirectoryInfo Directory, CatalogEntry Entry) : ResolvedPackage(Package, ResolvedFramework, Entry);
|
public record CachedPackage(Package Package, NuGetFramework ResolvedFramework, DirectoryInfo Directory, CatalogEntry Entry) : ResolvedPackage(Package, ResolvedFramework, Entry);
|
||||||
public record RemotePackage(Package Package, NuGetFramework ResolvedFramework, NuGetClient Client, CatalogEntry Entry) : ResolvedPackage(Package, ResolvedFramework, Entry);
|
public record RemotePackage(Package Package, NuGetFramework ResolvedFramework, NuGetClient Client, CatalogEntry Entry) : ResolvedPackage(Package, ResolvedFramework, Entry);
|
||||||
|
|
||||||
public abstract record ResolvedPackage(Package Package, NuGetFramework ResolvedFramework, CatalogEntry Entry);
|
// should not inherit from RemotePackage
|
||||||
|
public record RemoteDependencyPackage(
|
||||||
|
Package Package,
|
||||||
|
NuGetFramework ResolvedFramework,
|
||||||
|
NuGetClient Client,
|
||||||
|
RemotePackage Parent,
|
||||||
|
CatalogEntry Entry) : ResolvedPackage(Package, ResolvedFramework, Entry);
|
||||||
|
|
||||||
public record Package(int Order, string Id, NuGetVersion Version, ImmutableArray<string> Dependencies) : IComparable<Package>, IComparable
|
public abstract record ResolvedPackage(Package Package, NuGetFramework ResolvedFramework, CatalogEntry Entry) : IComparable<ResolvedPackage>, IComparable
|
||||||
|
{
|
||||||
|
public int CompareTo(ResolvedPackage? other)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(this, other)) return 0;
|
||||||
|
if (other is null) return 1;
|
||||||
|
return Package.CompareTo(other.Package);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompareTo(object? obj)
|
||||||
|
{
|
||||||
|
if (obj is null) return 1;
|
||||||
|
if (ReferenceEquals(this, obj)) return 0;
|
||||||
|
return obj is ResolvedPackage other ? CompareTo(other) : throw new ArgumentException($"Object must be of type {nameof(ResolvedPackage)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode() => Package.GetHashCode();
|
||||||
|
|
||||||
|
public virtual bool Equals(Package? other)
|
||||||
|
{
|
||||||
|
if (other is null) return false;
|
||||||
|
return Package.Equals(other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public record Package(int Order, string Id, NuGetVersion Version) : IComparable<Package>, IComparable
|
||||||
{
|
{
|
||||||
public int CompareTo(Package? other)
|
public int CompareTo(Package? other)
|
||||||
{
|
{
|
||||||
|
@@ -2,20 +2,11 @@
|
|||||||
"version": 1,
|
"version": 1,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"net9.0-windows7.0": {
|
"net9.0-windows7.0": {
|
||||||
"Basic.Reference.Assemblies.Net80": {
|
"Basic.Reference.Assemblies.Net90": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[1.7.9, )",
|
"requested": "[1.7.9, )",
|
||||||
"resolved": "1.7.9",
|
"resolved": "1.7.9",
|
||||||
"contentHash": "1wbS9ZJLFVrKD2jqv27gekIrpjpLffR9sitLQh5drWoG9KbyR/CgrAhw5I0c8Eq3zFMOToCmrpZi3VpRoInCgg==",
|
"contentHash": "9CUkU6Z17tJL/cQc6FeZL0qfQf4CBaNpSBqFL6CTmrIC8827x7NEPyNq/inZA/r6Y5ziWo2Yd8caMxLPqDUpeA==",
|
||||||
"dependencies": {
|
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Basic.Reference.Assemblies.Net80Windows": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[1.7.9, )",
|
|
||||||
"resolved": "1.7.9",
|
|
||||||
"contentHash": "98GFm8MC+pv37rTHaxBm5KFucqdJj0jK0XRHSGt2sXK9HNqtGImIFCFahxjUzskQjiUkPAzVhTou2OYZOuhhEg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
"Microsoft.CodeAnalysis.Common": "4.11.0"
|
||||||
}
|
}
|
||||||
@@ -39,9 +30,9 @@
|
|||||||
},
|
},
|
||||||
"Krafs.Publicizer": {
|
"Krafs.Publicizer": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[2.2.1, )",
|
"requested": "[2.3.0, )",
|
||||||
"resolved": "2.2.1",
|
"resolved": "2.3.0",
|
||||||
"contentHash": "QGI4nMGQbKsuFUUboixVHu4mv3lHB5RejIa7toIlzTmwLkuCYYEpUBJjmy3OpXYyj5dVSZAXVbr4oeMSloE67Q=="
|
"contentHash": "DjktTgctwxUMhMkWKrRECer3LR1lHzanCOlE4mpinAiY8SfWJq4DG/QitP5h1A+WBjyWHzQSOG+204i3VpO1FA=="
|
||||||
},
|
},
|
||||||
"Lib.Harmony.Thin": {
|
"Lib.Harmony.Thin": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
|
@@ -56,7 +56,7 @@ public record ManifestPackageKey(string Id, NuGetVersion Version)
|
|||||||
public override string ToString() => $"{Id}/{Version}";
|
public override string ToString() => $"{Id}/{Version}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DependencyManifestBuilder(DirectoryInfo cacheDirectory, PackageSourceMapping packageSources, Func<Models.Dependency, NuGetVersion?> versionResolver)
|
public class DependencyManifestBuilder(DirectoryInfo cacheDirectory, PackageSourceMapping packageSources, Func<Models.Dependency, CatalogEntry?> catalogEntryResolver)
|
||||||
{
|
{
|
||||||
private static readonly JsonSerializerOptions SerializerOptions = new(JsonSerializerDefaults.Web)
|
private static readonly JsonSerializerOptions SerializerOptions = new(JsonSerializerDefaults.Web)
|
||||||
{
|
{
|
||||||
@@ -100,21 +100,10 @@ public class DependencyManifestBuilder(DirectoryInfo cacheDirectory, PackageSour
|
|||||||
targets.Add(new(catalogEntry.Id, catalogEntry.Version),
|
targets.Add(new(catalogEntry.Id, catalogEntry.Version),
|
||||||
await MapEntryAsync(catalogEntry, nearest));
|
await MapEntryAsync(catalogEntry, nearest));
|
||||||
|
|
||||||
foreach (var dependency in nearest.Dependencies ?? [])
|
foreach (var entry in (nearest.Dependencies ?? []).Select(catalogEntryResolver))
|
||||||
{
|
{
|
||||||
var client = await packageSources.GetClientAsync(dependency.Id);
|
|
||||||
var registrationRoot = await client.GetPackageRegistrationRootAsync(dependency.Id);
|
|
||||||
|
|
||||||
var version = versionResolver(dependency)!;
|
|
||||||
var entry = registrationRoot.Items.SelectMany(b => b.Items ?? []).FirstOrDefault(b => b.CatalogEntry.Version == version)?.CatalogEntry;
|
|
||||||
|
|
||||||
if (entry is null)
|
if (entry is null)
|
||||||
{
|
continue;
|
||||||
var (url, sleetEntry) = await client.GetPackageRegistrationAsync(dependency.Id, versionResolver(dependency)!);
|
|
||||||
|
|
||||||
entry = sleetEntry;
|
|
||||||
entry ??= await client.GetPackageCatalogEntryAsync(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
await MapCatalogEntryAsync(entry, targetFramework, targets);
|
await MapCatalogEntryAsync(entry, targetFramework, targets);
|
||||||
}
|
}
|
||||||
@@ -124,7 +113,9 @@ public class DependencyManifestBuilder(DirectoryInfo cacheDirectory, PackageSour
|
|||||||
{
|
{
|
||||||
var packageEntries = entry.PackageEntries ?? await GetPackageContent(entry);
|
var packageEntries = entry.PackageEntries ?? await GetPackageContent(entry);
|
||||||
|
|
||||||
return new(group.Dependencies?.ToImmutableDictionary(b => b.Id, versionResolver) ?? ImmutableDictionary<string, NuGetVersion>.Empty,
|
return new(
|
||||||
|
group.Dependencies?.ToImmutableDictionary(b => b.Id, b => catalogEntryResolver(b)!.Version) ??
|
||||||
|
ImmutableDictionary<string, NuGetVersion>.Empty,
|
||||||
packageEntries.Where(b => b.FullName.StartsWith($"lib/{group.TargetFramework.GetShortFolderName()}/"))
|
packageEntries.Where(b => b.FullName.StartsWith($"lib/{group.TargetFramework.GetShortFolderName()}/"))
|
||||||
.ToImmutableDictionary(b => b.FullName, _ => new RuntimeDependency()),
|
.ToImmutableDictionary(b => b.FullName, _ => new RuntimeDependency()),
|
||||||
packageEntries.Where(b =>
|
packageEntries.Where(b =>
|
||||||
|
Reference in New Issue
Block a user