Fixes for dependency resolution
All checks were successful
Build / Compute Version (push) Successful in 6s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 46s
Build / Build Nuget package (NuGet) (push) Successful in 56s
Build / Build Nuget package (SharedCringe) (push) Successful in 1m0s
Build / Build Nuget package (CringePlugins) (push) Successful in 1m5s
Build / Build Launcher (push) Successful in 1m37s
All checks were successful
Build / Compute Version (push) Successful in 6s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 46s
Build / Build Nuget package (NuGet) (push) Successful in 56s
Build / Build Nuget package (SharedCringe) (push) Successful in 1m0s
Build / Build Nuget package (CringePlugins) (push) Successful in 1m5s
Build / Build Launcher (push) Successful in 1m37s
steamworks added to builtin packages
This commit is contained in:
@@ -337,7 +337,6 @@
|
|||||||
"Microsoft.CodeAnalysis.CSharp": "[4.13.0, )",
|
"Microsoft.CodeAnalysis.CSharp": "[4.13.0, )",
|
||||||
"NLog": "[5.4.0, )",
|
"NLog": "[5.4.0, )",
|
||||||
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
||||||
"Steamworks.NET": "[20.1.0, )",
|
|
||||||
"System.Diagnostics.PerformanceCounter": "[9.0.4, )",
|
"System.Diagnostics.PerformanceCounter": "[9.0.4, )",
|
||||||
"System.Management": "[9.0.4, )",
|
"System.Management": "[9.0.4, )",
|
||||||
"System.Private.ServiceModel": "[4.10.3, )",
|
"System.Private.ServiceModel": "[4.10.3, )",
|
||||||
@@ -355,6 +354,7 @@
|
|||||||
"NuGet": "[1.0.0, )",
|
"NuGet": "[1.0.0, )",
|
||||||
"SharedCringe": "[1.0.0, )",
|
"SharedCringe": "[1.0.0, )",
|
||||||
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
||||||
|
"Steamworks.NET": "[20.1.0, 20.1.0]",
|
||||||
"dnlib": "[4.4.0, )"
|
"dnlib": "[4.4.0, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -40,7 +40,6 @@
|
|||||||
<PackageReference Include="NLog" Version="5.4.0" />
|
<PackageReference Include="NLog" Version="5.4.0" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.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" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -62,12 +62,6 @@
|
|||||||
"protobuf-net": "1.0.0"
|
"protobuf-net": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Steamworks.NET": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[20.1.0, )",
|
|
||||||
"resolved": "20.1.0",
|
|
||||||
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
|
||||||
},
|
|
||||||
"System.Diagnostics.PerformanceCounter": {
|
"System.Diagnostics.PerformanceCounter": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[9.0.4, )",
|
"requested": "[9.0.4, )",
|
||||||
@@ -262,6 +256,11 @@
|
|||||||
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
|
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Steamworks.NET": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "20.1.0",
|
||||||
|
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
||||||
|
},
|
||||||
"System.Buffers": {
|
"System.Buffers": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "4.5.1",
|
"resolved": "4.5.1",
|
||||||
@@ -376,6 +375,7 @@
|
|||||||
"NuGet": "[1.0.0, )",
|
"NuGet": "[1.0.0, )",
|
||||||
"SharedCringe": "[1.0.0, )",
|
"SharedCringe": "[1.0.0, )",
|
||||||
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
"SpaceEngineersDedicated.ReferenceAssemblies": "[1.*, )",
|
||||||
|
"Steamworks.NET": "[20.1.0, 20.1.0]",
|
||||||
"dnlib": "[4.4.0, )"
|
"dnlib": "[4.4.0, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -397,12 +397,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"net9.0-windows10.0.19041/win-x64": {
|
"net9.0-windows10.0.19041/win-x64": {
|
||||||
"Steamworks.NET": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[20.1.0, )",
|
|
||||||
"resolved": "20.1.0",
|
|
||||||
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
|
||||||
},
|
|
||||||
"System.Diagnostics.PerformanceCounter": {
|
"System.Diagnostics.PerformanceCounter": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[9.0.4, )",
|
"requested": "[9.0.4, )",
|
||||||
@@ -431,6 +425,11 @@
|
|||||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Steamworks.NET": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "20.1.0",
|
||||||
|
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
||||||
|
},
|
||||||
"System.Diagnostics.EventLog": {
|
"System.Diagnostics.EventLog": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "9.0.4",
|
"resolved": "9.0.4",
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
<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="Steamworks.NET" Version="[20.1.0]" />
|
||||||
<PackageReference Include="Krafs.Publicizer" Version="2.3.0">
|
<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>
|
||||||
|
@@ -59,15 +59,16 @@ public class PluginsLifetime(string gameFolder) : ILoadingStage
|
|||||||
var packages = await resolver.ResolveAsync();
|
var packages = await resolver.ResolveAsync();
|
||||||
|
|
||||||
progress.Report("Downloading packages");
|
progress.Report("Downloading packages");
|
||||||
|
|
||||||
var cachedPackages = await resolver.DownloadPackagesAsync(_dir.CreateSubdirectory("cache"), packages, progress);
|
var builtInPackages = BuiltInPackages.GetPackages(_runtimeFramework).ToImmutableDictionary(package => package.Package.Id);
|
||||||
|
var cachedPackages = await resolver.DownloadPackagesAsync(_dir.CreateSubdirectory("cache"), packages, builtInPackages.Keys.ToHashSet(), progress);
|
||||||
|
|
||||||
progress.Report("Loading plugins");
|
progress.Report("Loading plugins");
|
||||||
|
|
||||||
//we can move this, but it should be before plugin init
|
//we can move this, but it should be before plugin init
|
||||||
RenderHandler.Current.RegisterComponent(new NotificationsComponent());
|
RenderHandler.Current.RegisterComponent(new NotificationsComponent());
|
||||||
|
|
||||||
await LoadPlugins(cachedPackages, sourceMapping, packagesConfig);
|
await LoadPlugins(cachedPackages, sourceMapping, packagesConfig, builtInPackages);
|
||||||
|
|
||||||
RenderHandler.Current.RegisterComponent(new PluginListComponent(packagesConfig, sourceMapping, configPath, gameFolder, _plugins));
|
RenderHandler.Current.RegisterComponent(new PluginListComponent(packagesConfig, sourceMapping, configPath, gameFolder, _plugins));
|
||||||
}
|
}
|
||||||
@@ -91,12 +92,9 @@ public class PluginsLifetime(string gameFolder) : ILoadingStage
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task LoadPlugins(IReadOnlyCollection<CachedPackage> packages, PackageSourceMapping sourceMapping,
|
private async Task LoadPlugins(IReadOnlyCollection<CachedPackage> packages, PackageSourceMapping sourceMapping,
|
||||||
PackagesConfig packagesConfig)
|
PackagesConfig packagesConfig, ImmutableDictionary<string, ResolvedPackage> builtInPackages)
|
||||||
{
|
{
|
||||||
var plugins = _plugins.ToBuilder();
|
var plugins = _plugins.ToBuilder();
|
||||||
|
|
||||||
var builtInPackages = BuiltInPackages.GetPackages(_runtimeFramework)
|
|
||||||
.ToImmutableDictionary(package => package.Package.Id);
|
|
||||||
|
|
||||||
var resolvedPackages = builtInPackages.ToDictionary();
|
var resolvedPackages = builtInPackages.ToDictionary();
|
||||||
foreach (var package in packages)
|
foreach (var package in packages)
|
||||||
@@ -120,8 +118,17 @@ public class PluginsLifetime(string gameFolder) : ILoadingStage
|
|||||||
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);
|
try
|
||||||
await manifestBuilder.WriteDependencyManifestAsync(stream, package.Entry, _runtimeFramework);
|
{
|
||||||
|
await using var stream = File.Create(path);
|
||||||
|
await manifestBuilder.WriteDependencyManifestAsync(stream, package.Entry, _runtimeFramework);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error(ex, $"Failed to write dependency manifest for {path}");
|
||||||
|
File.Delete(path); //delete file to avoid breaking cache
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var client = await sourceMapping.GetClientAsync(package.Package.Id);
|
var client = await sourceMapping.GetClientAsync(package.Package.Id);
|
||||||
|
@@ -21,6 +21,7 @@ public static class BuiltInPackages
|
|||||||
private const string SeReferenceAssemblies = "SpaceEngineersDedicated.ReferenceAssemblies";
|
private const string SeReferenceAssemblies = "SpaceEngineersDedicated.ReferenceAssemblies";
|
||||||
private const string ImGui = "ImGui.NET.DirectX";
|
private const string ImGui = "ImGui.NET.DirectX";
|
||||||
private const string Harmony = "Lib.Harmony.Thin";
|
private const string Harmony = "Lib.Harmony.Thin";
|
||||||
|
private const string Steamworks = "Steamworks.NET";
|
||||||
|
|
||||||
public static ImmutableArray<ResolvedPackage> GetPackages(NuGetFramework runtimeFramework)
|
public static ImmutableArray<ResolvedPackage> GetPackages(NuGetFramework runtimeFramework)
|
||||||
{
|
{
|
||||||
@@ -32,6 +33,7 @@ public static class BuiltInPackages
|
|||||||
], SeReferenceAssemblies, new(seVersion));
|
], SeReferenceAssemblies, new(seVersion));
|
||||||
var imGui = FromAssembly<ImGuiKey>(runtimeFramework, id: ImGui);
|
var imGui = FromAssembly<ImGuiKey>(runtimeFramework, id: ImGui);
|
||||||
var harmony = FromAssembly<HarmonyLib.Harmony>(runtimeFramework, id: Harmony);
|
var harmony = FromAssembly<HarmonyLib.Harmony>(runtimeFramework, id: Harmony);
|
||||||
|
var steam = FromAssembly<Steamworks.CSteamID>(runtimeFramework, id: Steamworks);
|
||||||
|
|
||||||
BuiltInSdkPackage MapSdkPackage(
|
BuiltInSdkPackage MapSdkPackage(
|
||||||
(string FileName, byte[] ImageBytes, PortableExecutableReference Reference, Guid Mvid) r)
|
(string FileName, byte[] ImageBytes, PortableExecutableReference Reference, Guid Mvid) r)
|
||||||
@@ -53,6 +55,7 @@ public static class BuiltInPackages
|
|||||||
se,
|
se,
|
||||||
imGui,
|
imGui,
|
||||||
harmony,
|
harmony,
|
||||||
|
steam,
|
||||||
FromAssembly<PluginsLifetime>(runtimeFramework,
|
FromAssembly<PluginsLifetime>(runtimeFramework,
|
||||||
[se.AsDependency(), imGui.AsDependency(), harmony.AsDependency()]
|
[se.AsDependency(), imGui.AsDependency(), harmony.AsDependency()]
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
@@ -14,7 +14,7 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
public async Task<ImmutableSortedSet<ResolvedPackage>> ResolveAsync()
|
public async Task<ImmutableSortedSet<ResolvedPackage>> ResolveAsync()
|
||||||
{
|
{
|
||||||
var order = 0;
|
var order = 0;
|
||||||
var packages = new SortedDictionary<Package, CatalogEntry>();
|
var packages = new Dictionary<Package, CatalogEntry>();
|
||||||
|
|
||||||
foreach (var reference in references)
|
foreach (var reference in references)
|
||||||
{
|
{
|
||||||
@@ -39,7 +39,7 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
var version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().First(b => reference.Range.Satisfies(b));
|
var version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().First(b => reference.Range.Satisfies(b));
|
||||||
|
|
||||||
if (version is null)
|
if (version is null)
|
||||||
throw new Exception($"Unable to find version for package {reference.Id}");
|
throw new NotSupportedException($"Unable to find version for package {reference.Id}");
|
||||||
|
|
||||||
var catalogEntry = items[version].CatalogEntry;
|
var catalogEntry = items[version].CatalogEntry;
|
||||||
|
|
||||||
@@ -48,22 +48,18 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
if (packages.TryAdd(package, catalogEntry))
|
if (packages.TryAdd(package, catalogEntry))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!packages.TryGetValue(package, out _))
|
if (!packages.TryGetValue(package, out var existingEntry))
|
||||||
throw new Exception($"Duplicate package {package.Id}");
|
throw new InvalidOperationException($"Duplicate package error {package.Id}");
|
||||||
|
|
||||||
var existingPackage = packages.Keys.First(b => b.Version == package.Version && b.Id == package.Id);
|
|
||||||
|
|
||||||
if (package.Version < existingPackage.Version)
|
|
||||||
throw new Exception($"Package reference {package.Id} has lower version {package.Version} than already resolved {existingPackage.Version}");
|
|
||||||
|
|
||||||
if (package.Version == existingPackage.Version)
|
if (package.Version < existingEntry.Version)
|
||||||
|
throw new NotSupportedException($"Package reference {package.Id} has lower version {package.Version} than already resolved {existingEntry.Version}");
|
||||||
|
|
||||||
|
if (package.Version == existingEntry.Version)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
packages.Remove(existingPackage);
|
packages[package with { Order = ++order }] = catalogEntry;
|
||||||
packages.Add(package with
|
|
||||||
{
|
|
||||||
Order = ++order
|
|
||||||
}, catalogEntry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var set = ImmutableSortedSet<ResolvedPackage>.Empty.ToBuilder();
|
var set = ImmutableSortedSet<ResolvedPackage>.Empty.ToBuilder();
|
||||||
@@ -78,11 +74,13 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
g => g.TargetFramework);
|
g => g.TargetFramework);
|
||||||
|
|
||||||
if (nearestGroup is null)
|
if (nearestGroup is null)
|
||||||
throw new Exception($"Unable to find compatible dependency group for package {package.Id}");
|
throw new NotSupportedException($"Unable to find compatible dependency group for package {package.Id}");
|
||||||
|
|
||||||
set.Add(new RemotePackage(package, nearestGroup.TargetFramework, client, catalogEntry));
|
set.Add(new RemotePackage(package, nearestGroup.TargetFramework, client, catalogEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dependencyVersions = new Dictionary<Package, VersionRange>();
|
||||||
|
var dependencyPackages = new HashSet<RemoteDependencyPackage>();
|
||||||
for (var i = 0; i < set.Count; i++)
|
for (var i = 0; i < set.Count; i++)
|
||||||
{
|
{
|
||||||
if (set[i] is not RemotePackage package) continue;
|
if (set[i] is not RemotePackage package) continue;
|
||||||
@@ -103,79 +101,105 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException ex)
|
||||||
{
|
{
|
||||||
throw new Exception($"Failed to resolve dependency {id} for {package.Package}", ex);
|
throw new InvalidOperationException($"Failed to resolve dependency {id} for {package.Package}", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
var items = registrationRoot.Items.SelectMany(page => page.Items!)
|
var items = registrationRoot.Items.SelectMany(page => page.Items!)
|
||||||
.ToImmutableDictionary(b => b.CatalogEntry.Version);
|
.ToImmutableDictionary(b => b.CatalogEntry.Version);
|
||||||
|
|
||||||
var version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().FirstOrDefault(b => versionRange.Satisfies(b));
|
var version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().FirstOrDefault(versionRange.Satisfies);
|
||||||
|
|
||||||
if (version is null)
|
if (version is null)
|
||||||
throw new Exception($"Unable to find version for package {id} as dependency of {package.Package}");
|
throw new NotSupportedException($"Unable to find version for package {id} as dependency of {package.Package}");
|
||||||
|
|
||||||
var catalogEntry = items[version].CatalogEntry;
|
var catalogEntry = items[version].CatalogEntry;
|
||||||
|
|
||||||
var dependencyPackage = new Package(i, id, version);
|
var dependencyPackage = new Package(i, id, version);
|
||||||
|
|
||||||
if (packages.TryGetValue(dependencyPackage, out var existingPackage))
|
if (packages.TryGetValue(dependencyPackage, out var existingCatalog))
|
||||||
{
|
{
|
||||||
if (dependencyPackage.Version < existingPackage.Version)
|
if (dependencyPackage.Version == existingCatalog.Version)
|
||||||
{
|
continue; //a dependency with this version has already been resolved
|
||||||
// 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))
|
//does the existing version support our package?
|
||||||
throw new Exception(
|
if (versionRange.Satisfies(existingCatalog.Version))
|
||||||
$"Incompatible package version {dependencyPackage} (required by {package.Package}) from {existingPackage}");
|
continue; //keep the old one
|
||||||
|
|
||||||
if (dependencyPackage.CompareTo(existingPackage) < 0)
|
if (!dependencyVersions.TryGetValue(dependencyPackage, out var minimalVersionRange))
|
||||||
{
|
throw new InvalidOperationException("Missing minimal version range");
|
||||||
packages.Remove(dependencyPackage);
|
|
||||||
packages.Add(dependencyPackage, existingPackage);
|
minimalVersionRange = VersionRange.CommonSubSet([minimalVersionRange, versionRange]);
|
||||||
}
|
|
||||||
|
if (!minimalVersionRange.Satisfies(version))
|
||||||
continue;
|
{
|
||||||
|
//do one last check for a matching version
|
||||||
|
version = items.Values.Select(b => b.CatalogEntry.Version).OrderDescending().FirstOrDefault(minimalVersionRange.Satisfies);
|
||||||
|
|
||||||
|
if (version is null)
|
||||||
|
throw new NotSupportedException($"Unable to find version for package {id} as dependency of {package.Package} (and others) that satisfies {minimalVersionRange}");
|
||||||
|
|
||||||
|
catalogEntry = items[version].CatalogEntry;
|
||||||
|
|
||||||
|
dependencyPackage = dependencyPackage with { Version = version };
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception($"Detected package downgrade from {existingPackage} to {dependencyPackage} as dependency of {package.Package}");
|
//swap to this version
|
||||||
|
packages[dependencyPackage] = catalogEntry;
|
||||||
|
dependencyVersions[dependencyPackage] = minimalVersionRange;
|
||||||
|
|
||||||
|
var replacementGroup = NuGetFrameworkUtility.GetNearest(catalogEntry.DependencyGroups ?? [], runtimeFramework, g => g.TargetFramework)
|
||||||
|
?? throw new NotSupportedException($"Unable to find compatible dependency group for {dependencyPackage} as dependency of {package.Package}");
|
||||||
|
|
||||||
|
var replacement = new RemoteDependencyPackage(dependencyPackage, replacementGroup.TargetFramework, client, package, catalogEntry);
|
||||||
|
|
||||||
|
if (!dependencyPackages.Remove(replacement))
|
||||||
|
throw new InvalidOperationException("Replaced dependency wasn't there");
|
||||||
|
|
||||||
|
dependencyPackages.Add(replacement);
|
||||||
|
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!packages.TryAdd(dependencyPackage, catalogEntry))
|
if (!packages.TryAdd(dependencyPackage, catalogEntry) || !dependencyVersions.TryAdd(dependencyPackage, versionRange))
|
||||||
throw new Exception($"Duplicate package {dependencyPackage.Id}");
|
throw new InvalidOperationException($"Duplicate package {dependencyPackage.Id}");
|
||||||
|
|
||||||
var nearestGroup = NuGetFrameworkUtility.GetNearest(catalogEntry.DependencyGroups ?? [], runtimeFramework,
|
var nearestGroup = NuGetFrameworkUtility.GetNearest(catalogEntry.DependencyGroups ?? [], runtimeFramework,
|
||||||
g => g.TargetFramework);
|
g => g.TargetFramework) ?? throw new NotSupportedException($"Unable to find compatible dependency group for {dependencyPackage} as dependency of {package.Package}");
|
||||||
|
|
||||||
if (nearestGroup is null)
|
dependencyPackages.Add(new RemoteDependencyPackage(dependencyPackage, nearestGroup.TargetFramework, client, package, catalogEntry));
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var item in dependencyPackages)
|
||||||
|
set.Add(item);
|
||||||
|
|
||||||
return set.ToImmutable();
|
return set.ToImmutable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ImmutableHashSet<CachedPackage>> DownloadPackagesAsync(DirectoryInfo baseDirectory,
|
public async Task<ImmutableHashSet<CachedPackage>> DownloadPackagesAsync(DirectoryInfo baseDirectory,
|
||||||
IReadOnlySet<ResolvedPackage> resolvedPackages, IProgress<float>? progress = null)
|
IReadOnlySet<ResolvedPackage> resolvedPackages, IReadOnlySet<string>? ignorePackages = null, IProgress<float>? progress = null)
|
||||||
{
|
{
|
||||||
var packages = ImmutableHashSet<CachedPackage>.Empty.ToBuilder();
|
var packages = ImmutableHashSet<CachedPackage>.Empty.ToBuilder();
|
||||||
|
|
||||||
var i = 0f;
|
var i = 0f;
|
||||||
foreach (var package in resolvedPackages)
|
foreach (var package in resolvedPackages)
|
||||||
{
|
{
|
||||||
|
if (ignorePackages?.Contains(package.Package.Id) == true)
|
||||||
|
continue;
|
||||||
|
|
||||||
switch (package)
|
switch (package)
|
||||||
{
|
{
|
||||||
case RemotePackage remotePackage:
|
case RemoteDependencyPackage:
|
||||||
|
case RemotePackage:
|
||||||
{
|
{
|
||||||
var dir = new DirectoryInfo(Path.Join(baseDirectory.FullName, package.Package.Id, package.Package.Version.ToString()));
|
var dir = new DirectoryInfo(Path.Join(baseDirectory.FullName, package.Package.Id, package.Package.Version.ToString()));
|
||||||
if (!dir.Exists)
|
if (!dir.Exists)
|
||||||
{
|
{
|
||||||
dir.Create();
|
dir.Create();
|
||||||
|
|
||||||
await using var stream = await remotePackage.Client.GetPackageContentStreamAsync(remotePackage.Package.Id, remotePackage.Package.Version);
|
var client = (package as RemoteDependencyPackage)?.Client ?? ((RemotePackage)package).Client;
|
||||||
|
|
||||||
|
await using var stream = await client.GetPackageContentStreamAsync(package.Package.Id, package.Package.Version);
|
||||||
using var memStream = new MemoryStream();
|
using var memStream = new MemoryStream();
|
||||||
await stream.CopyToAsync(memStream);
|
await stream.CopyToAsync(memStream);
|
||||||
memStream.Position = 0;
|
memStream.Position = 0;
|
||||||
@@ -189,6 +213,8 @@ public class PackageResolver(NuGetFramework runtimeFramework, ImmutableArray<Pac
|
|||||||
case CachedPackage cachedPackage:
|
case CachedPackage cachedPackage:
|
||||||
packages.Add(cachedPackage);
|
packages.Add(cachedPackage);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
progress?.Report(i++ / resolvedPackages.Count);
|
progress?.Report(i++ / resolvedPackages.Count);
|
||||||
|
@@ -60,6 +60,12 @@
|
|||||||
"protobuf-net": "1.0.0"
|
"protobuf-net": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Steamworks.NET": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[20.1.0, 20.1.0]",
|
||||||
|
"resolved": "20.1.0",
|
||||||
|
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
||||||
|
},
|
||||||
"Microsoft.Bcl.AsyncInterfaces": {
|
"Microsoft.Bcl.AsyncInterfaces": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "6.0.0",
|
"resolved": "6.0.0",
|
||||||
@@ -211,6 +217,12 @@
|
|||||||
"System.Numerics.Vectors": "4.5.0",
|
"System.Numerics.Vectors": "4.5.0",
|
||||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Steamworks.NET": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[20.1.0, 20.1.0]",
|
||||||
|
"resolved": "20.1.0",
|
||||||
|
"contentHash": "+GntwnyJ5tCNvUIaQxv2+ehDvZJzGUqlSB5xRBk1hTj1qqBJ6s4vK/OfGD/jae7aTmXiGSm8wpJORosNtQevJQ=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user