introduction of nuget packages as plugins support
This commit is contained in:
@@ -33,7 +33,8 @@ namespace Torch
|
||||
bool EntityManagerEnabled { get; set; }
|
||||
string LoginToken { get; set; }
|
||||
UpdateSource UpdateSource { get; set; }
|
||||
|
||||
List<string> Packages { get; set; }
|
||||
|
||||
void Save(string path = null);
|
||||
}
|
||||
|
||||
|
14
Torch.API/Managers/IPackageManager.cs
Normal file
14
Torch.API/Managers/IPackageManager.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
using Torch.API.WebAPI.Plugins;
|
||||
|
||||
namespace Torch.API.Managers;
|
||||
|
||||
public interface IPackageManager : IManager
|
||||
{
|
||||
IReadOnlySet<Package> Packages { get; }
|
||||
|
||||
bool TryGetPackageAssemblies(Package package, [MaybeNullWhen(false)] out Assembly[] assemblies);
|
||||
}
|
@@ -18,10 +18,13 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JorgeSerrano.Json.JsonSnakeCaseNamingPolicy" Version="0.9.0" />
|
||||
<PackageReference Include="NLog" Version="5.1.0" />
|
||||
<PackageReference Include="NuGet.Commands" Version="6.4.0" />
|
||||
<PackageReference Include="NuGet.DependencyResolver.Core" Version="6.4.0" />
|
||||
<PackageReference Include="SemanticVersioning" Version="2.0.2" />
|
||||
<PackageReference Include="SpaceEngineersDedicated.ReferenceAssemblies" Version="1.201.13">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>compile</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
|
||||
</ItemGroup>
|
||||
</Project>
|
11
Torch.API/WebAPI/Plugins/IPackageItem.cs
Normal file
11
Torch.API/WebAPI/Plugins/IPackageItem.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
#nullable enable
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public interface IPackageItem
|
||||
{
|
||||
Task<Stream> OpenFileAsync();
|
||||
public string FileName { get; }
|
||||
}
|
12
Torch.API/WebAPI/Plugins/IPackageReader.cs
Normal file
12
Torch.API/WebAPI/Plugins/IPackageReader.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public interface IPackageReader
|
||||
{
|
||||
Task<(IEnumerable<IPackageItem> Root, IReadOnlyDictionary<PackageDependency, IEnumerable<IPackageItem>> Dependencies)> GetItemsAsync();
|
||||
}
|
11
Torch.API/WebAPI/Plugins/IPackageResolver.cs
Normal file
11
Torch.API/WebAPI/Plugins/IPackageResolver.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public interface IPackageResolver
|
||||
{
|
||||
Task<IEnumerable<Package>> ResolvePackagesAsync(IReadOnlyDictionary<string, string> packages);
|
||||
Task<IPackageReader> GetPackageAsync(Package package);
|
||||
}
|
87
Torch.API/WebAPI/Plugins/NLogLogger.cs
Normal file
87
Torch.API/WebAPI/Plugins/NLogLogger.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using NuGet.Common;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
internal class NLogLogger : ILogger
|
||||
{
|
||||
private readonly NLog.ILogger _logger;
|
||||
|
||||
public NLogLogger(NLog.ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void LogDebug(string data)
|
||||
{
|
||||
_logger.Debug(data);
|
||||
}
|
||||
|
||||
public void LogVerbose(string data)
|
||||
{
|
||||
_logger.Trace(data);
|
||||
}
|
||||
|
||||
public void LogInformation(string data)
|
||||
{
|
||||
_logger.Info(data);
|
||||
}
|
||||
|
||||
public void LogMinimal(string data)
|
||||
{
|
||||
_logger.Debug(data);
|
||||
}
|
||||
|
||||
public void LogWarning(string data)
|
||||
{
|
||||
_logger.Warn(data);
|
||||
}
|
||||
|
||||
public void LogError(string data)
|
||||
{
|
||||
_logger.Error(data);
|
||||
}
|
||||
|
||||
public void LogInformationSummary(string data)
|
||||
{
|
||||
_logger.Info(data);
|
||||
}
|
||||
|
||||
public void Log(LogLevel level, string data)
|
||||
{
|
||||
_logger.Log(ToNLogLevel(level), data);
|
||||
}
|
||||
|
||||
private static NLog.LogLevel ToNLogLevel(LogLevel level)
|
||||
{
|
||||
return level switch
|
||||
{
|
||||
LogLevel.Debug => NLog.LogLevel.Debug,
|
||||
LogLevel.Verbose => NLog.LogLevel.Trace,
|
||||
LogLevel.Information => NLog.LogLevel.Info,
|
||||
LogLevel.Minimal => NLog.LogLevel.Debug,
|
||||
LogLevel.Warning => NLog.LogLevel.Warn,
|
||||
LogLevel.Error => NLog.LogLevel.Error,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(level), level, null)
|
||||
};
|
||||
}
|
||||
|
||||
public Task LogAsync(LogLevel level, string data)
|
||||
{
|
||||
Log(level, data);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Log(ILogMessage message)
|
||||
{
|
||||
_logger.Log(ToNLogLevel(message.Level), message.FormatWithCode);
|
||||
}
|
||||
|
||||
public Task LogAsync(ILogMessage message)
|
||||
{
|
||||
Log(message);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
10
Torch.API/WebAPI/Plugins/Package.cs
Normal file
10
Torch.API/WebAPI/Plugins/Package.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System.Collections.Generic;
|
||||
using NuGet.DependencyResolver;
|
||||
using SemanticVersioning;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public record Package(string Name, Version Version, IReadOnlySet<PackageDependency> Dependencies)
|
||||
{
|
||||
internal GraphItem<RemoteResolveResult> Graph { get; init; }
|
||||
}
|
9
Torch.API/WebAPI/Plugins/PackageDependency.cs
Normal file
9
Torch.API/WebAPI/Plugins/PackageDependency.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using NuGet.DependencyResolver;
|
||||
using SemanticVersioning;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public record PackageDependency(string Name, Version Version, PackageDependencyKind Kind)
|
||||
{
|
||||
internal RemoteMatch Match { get; init; }
|
||||
}
|
8
Torch.API/WebAPI/Plugins/PackageDependencyKind.cs
Normal file
8
Torch.API/WebAPI/Plugins/PackageDependencyKind.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public enum PackageDependencyKind
|
||||
{
|
||||
None,
|
||||
Transitive,
|
||||
Direct
|
||||
}
|
91
Torch.API/WebAPI/Plugins/PackageReader.cs
Normal file
91
Torch.API/WebAPI/Plugins/PackageReader.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using NuGet.Common;
|
||||
using NuGet.DependencyResolver;
|
||||
using NuGet.Frameworks;
|
||||
using NuGet.Packaging;
|
||||
using NuGet.Protocol.Core.Types;
|
||||
using NuGet.Versioning;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public class PackageReader : IPackageReader
|
||||
{
|
||||
private readonly Package _package;
|
||||
private readonly SourceCacheContext _cacheContext;
|
||||
private readonly ILogger _logger;
|
||||
private readonly NuGetFramework _framework;
|
||||
private readonly IFrameworkCompatibilityProvider _compatibilityProvider;
|
||||
private readonly DirectoryInfo _packagesDirectory;
|
||||
|
||||
public PackageReader(Package package, SourceCacheContext cacheContext, ILogger logger, NuGetFramework framework,
|
||||
IFrameworkCompatibilityProvider compatibilityProvider, DirectoryInfo packagesDirectory)
|
||||
{
|
||||
_package = package;
|
||||
_cacheContext = cacheContext;
|
||||
_logger = logger;
|
||||
_framework = framework;
|
||||
_compatibilityProvider = compatibilityProvider;
|
||||
_packagesDirectory = packagesDirectory;
|
||||
}
|
||||
|
||||
public async Task<(IEnumerable<IPackageItem> Root, IReadOnlyDictionary<PackageDependency, IEnumerable<IPackageItem>>
|
||||
Dependencies)>
|
||||
GetItemsAsync()
|
||||
{
|
||||
async Task<IEnumerable<IPackageItem>> GetPackageItemsAsync(string id, NuGetVersion version,
|
||||
IRemoteDependencyProvider provider)
|
||||
{
|
||||
var downloader =
|
||||
await provider.GetPackageDownloaderAsync(new(id, version), _cacheContext, _logger,
|
||||
CancellationToken.None);
|
||||
|
||||
await downloader.CopyNupkgFileToAsync(Path.Combine(_packagesDirectory.FullName, $"{id}.{version}.nupkg"),
|
||||
CancellationToken.None);
|
||||
|
||||
var frameworks = await downloader.ContentReader.GetReferenceItemsAsync(CancellationToken.None);
|
||||
var items = frameworks.Where(b => _compatibilityProvider.IsCompatible(_framework, b.TargetFramework))
|
||||
.MaxBy(b => b.TargetFramework.Version)?.Items;
|
||||
|
||||
return items?.Select(b => new PackageItem(b, downloader)) ?? ImmutableArray<PackageItem>.Empty;
|
||||
}
|
||||
|
||||
var rootIdentity = _package.Graph.Key;
|
||||
return (await GetPackageItemsAsync(rootIdentity.Name, rootIdentity.Version, _package.Graph.Data.Match.Provider),
|
||||
await _package.Dependencies.ToAsyncEnumerable().SelectManyAwait(async b =>
|
||||
(await GetPackageItemsAsync(
|
||||
b.Match.Library.Name,
|
||||
b.Match.Library.Version,
|
||||
b.Match.Provider))
|
||||
.ToAsyncEnumerable()
|
||||
.Select(c => (b, c)))
|
||||
.GroupBy(b => b.b, b => b.c)
|
||||
.ToDictionaryAwaitAsync<IAsyncGrouping<PackageDependency, IPackageItem>, PackageDependency,
|
||||
IEnumerable<IPackageItem>>(b => ValueTask.FromResult(b.Key),
|
||||
async b => await b.ToArrayAsync()));
|
||||
}
|
||||
}
|
||||
|
||||
file class PackageItem : IPackageItem
|
||||
{
|
||||
private readonly string _path;
|
||||
private readonly IPackageDownloader _downloader;
|
||||
|
||||
public string FileName => Path.GetFileName(_path);
|
||||
|
||||
public PackageItem(string path, IPackageDownloader downloader)
|
||||
{
|
||||
_path = path;
|
||||
_downloader = downloader;
|
||||
}
|
||||
|
||||
public Task<Stream> OpenFileAsync()
|
||||
{
|
||||
return _downloader.CoreReader.GetStreamAsync(_path, CancellationToken.None);
|
||||
}
|
||||
}
|
104
Torch.API/WebAPI/Plugins/PackageResolver.cs
Normal file
104
Torch.API/WebAPI/Plugins/PackageResolver.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using NLog;
|
||||
using NuGet.Commands;
|
||||
using NuGet.Configuration;
|
||||
using NuGet.DependencyResolver;
|
||||
using NuGet.Frameworks;
|
||||
using NuGet.LibraryModel;
|
||||
using NuGet.Protocol;
|
||||
using NuGet.Protocol.Core.Types;
|
||||
using NuGet.Versioning;
|
||||
using Version = SemanticVersioning.Version;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public class PackageResolver : IPackageResolver
|
||||
{
|
||||
private static readonly ILogger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private readonly NuGetFramework _framework = NuGetFramework.Parse("net7.0-windows7.0");
|
||||
private readonly NLogLogger _logger = new(Log);
|
||||
private readonly SourceCacheContext _sourceCacheContext = new();
|
||||
private readonly RemoteWalkContext _remoteWalkContext;
|
||||
private readonly DirectoryInfo _packagesDirectory;
|
||||
private readonly IFrameworkCompatibilityProvider _compatibilityProvider = DefaultCompatibilityProvider.Instance;
|
||||
|
||||
public PackageResolver(IEnumerable<PackageSource> sources, DirectoryInfo packagesDirectory)
|
||||
{
|
||||
_packagesDirectory = packagesDirectory;
|
||||
IReadOnlySet<PackageSource> packageSources = sources.Where(b => b.Type is PackageSourceType.NuGet).ToImmutableHashSet();
|
||||
|
||||
var mapping = new PackageSourceMapping(packageSources.ToDictionary(b => b.Name, b => b.Patterns));
|
||||
_remoteWalkContext = new RemoteWalkContext(_sourceCacheContext, mapping, _logger);
|
||||
|
||||
foreach (var (name, url, _, _) in packageSources)
|
||||
{
|
||||
var packageSource = new NuGet.Configuration.PackageSource(url, name);
|
||||
var sourceRepository = new SourceRepository(packageSource, new INuGetResourceProvider[]
|
||||
{
|
||||
new DownloadResourceV3Provider(),
|
||||
new DependencyInfoResourceV3Provider(),
|
||||
new ServiceIndexResourceV3Provider(),
|
||||
new RemoteV3FindPackageByIdResourceProvider(),
|
||||
new V3FeedListResourceProvider(),
|
||||
new HttpSourceResourceProvider(),
|
||||
new RegistrationResourceV3Provider(),
|
||||
new HttpHandlerResourceV3Provider()
|
||||
}.Select(b => new Lazy<INuGetResourceProvider>(b)), FeedType.HttpV3);
|
||||
|
||||
_remoteWalkContext.RemoteLibraryProviders.Add(
|
||||
new SourceRepositoryDependencyProvider(sourceRepository, _logger, _sourceCacheContext, true, false));
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Package>> ResolvePackagesAsync(
|
||||
IReadOnlyDictionary<string, string> packages)
|
||||
{
|
||||
Log.Info("Restoring {0} packages", packages.Count);
|
||||
|
||||
var graphs = await Task.WhenAll(packages.Select(b =>
|
||||
{
|
||||
var (key, versionRange) = b;
|
||||
var libraryRange = new LibraryRange(key, VersionRange.Parse(versionRange), LibraryDependencyTarget.All);
|
||||
return ResolverUtility.FindLibraryEntryAsync(libraryRange, _framework, "win-x64",
|
||||
_remoteWalkContext, CancellationToken.None);
|
||||
}));
|
||||
|
||||
return await graphs.ToAsyncEnumerable().SelectAwait(async graph =>
|
||||
{
|
||||
return new Package(graph.Key.Name, Version.Parse(graph.Key.Version.ToFullString()),
|
||||
await graph.Data.Dependencies
|
||||
.ToAsyncEnumerable()
|
||||
.SelectAwait(async b =>
|
||||
{
|
||||
var match = await ResolverUtility.FindLibraryByVersionAsync(
|
||||
b.LibraryRange, _framework, _remoteWalkContext.RemoteLibraryProviders,
|
||||
_sourceCacheContext, _logger, CancellationToken.None);
|
||||
|
||||
return new PackageDependency(
|
||||
b.Name, Version.Parse(match.Library.Version.ToFullString()),
|
||||
(PackageDependencyKind)b.ReferenceType)
|
||||
{
|
||||
Match = match
|
||||
};
|
||||
})
|
||||
.ToHashSetAsync())
|
||||
{
|
||||
Graph = graph
|
||||
};
|
||||
}).ToArrayAsync();
|
||||
}
|
||||
|
||||
public Task<IPackageReader> GetPackageAsync(Package package)
|
||||
{
|
||||
var reader = new PackageReader(package, _sourceCacheContext, _logger, _framework, _compatibilityProvider, _packagesDirectory);
|
||||
return Task.FromResult<IPackageReader>(reader);
|
||||
}
|
||||
}
|
8
Torch.API/WebAPI/Plugins/PackageSource.cs
Normal file
8
Torch.API/WebAPI/Plugins/PackageSource.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
#nullable enable
|
||||
public record PackageSource
|
||||
#nullable restore
|
||||
(string Name, string Url, IReadOnlyList<string> Patterns, PackageSourceType Type);
|
8
Torch.API/WebAPI/Plugins/PackageSourceType.cs
Normal file
8
Torch.API/WebAPI/Plugins/PackageSourceType.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
#nullable enable
|
||||
namespace Torch.API.WebAPI.Plugins;
|
||||
|
||||
public enum PackageSourceType
|
||||
{
|
||||
NuGet,
|
||||
LegacyTorch
|
||||
}
|
@@ -14,6 +14,27 @@
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "oW7ekrkRG9okpDMUcEglunWj8Qf2RY8qkgl+/chJoavzg3dbT13y32t19R54FKkmq80fKzw4ZekZkCrRGanKgQ=="
|
||||
},
|
||||
"NuGet.Commands": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.4.0, )",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "j3ma45boGZADsHpJcu3Y2yq+n2luicC6ezd61TXTTzbOzA452oAPaSsFGUB1stIsuP/DVoqkTzjHXjaCHuJKPQ==",
|
||||
"dependencies": {
|
||||
"NuGet.Credentials": "6.4.0",
|
||||
"NuGet.ProjectModel": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.DependencyResolver.Core": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.4.0, )",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "AKomZEKuhQlshujuiHbKvwl2cZNGq3SHsXFbpjCfCjMFMLwwA8saJGQQZp1lzsqQWcQWa6hLOcPtm7T3rd0SVg==",
|
||||
"dependencies": {
|
||||
"NuGet.Configuration": "6.4.0",
|
||||
"NuGet.LibraryModel": "6.4.0",
|
||||
"NuGet.Protocol": "6.4.0"
|
||||
}
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Direct",
|
||||
"requested": "[2.0.2, )",
|
||||
@@ -29,10 +50,128 @@
|
||||
"protobuf-net": "1.0.0"
|
||||
}
|
||||
},
|
||||
"System.Linq.Async": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.1, )",
|
||||
"resolved": "6.0.1",
|
||||
"contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.Bcl.AsyncInterfaces": "6.0.0"
|
||||
}
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg=="
|
||||
},
|
||||
"Newtonsoft.Json": {
|
||||
"type": "Transitive",
|
||||
"resolved": "13.0.1",
|
||||
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
|
||||
},
|
||||
"NuGet.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "srECugLk+LB1bXelDCDhHoi6do/EYTXzuntKhjHraS4roVB3NfWohEdCSiAPdpSV9M40Q6jo6MV2Srml9e+jHQ==",
|
||||
"dependencies": {
|
||||
"NuGet.Frameworks": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Configuration": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "vPjauG9AoacEjiZWGIs+d11FCRVmseqAw78FIApfLvZrYMEbbwc9vc0LdC3PpoW5FxYkktyZSiiXVKXGLu+gXw==",
|
||||
"dependencies": {
|
||||
"NuGet.Common": "6.4.0",
|
||||
"System.Security.Cryptography.ProtectedData": "4.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Credentials": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "tebsxclknVz3D4FrvE2MzVcsOyf6PffjGNQ77X9Yvbj9x5YpVWfumVPetqETcdsNEgiN0bBzfMre33lhrY7Itw==",
|
||||
"dependencies": {
|
||||
"NuGet.Protocol": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Frameworks": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "qcufbjJIDtyY/Hah7JJfcRVpRYM3scgPqYBnukjO9kfADCFGr2azvVBozuwzljA6w/cR3w8bXLq6vW5xGrsmHw=="
|
||||
},
|
||||
"NuGet.LibraryModel": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "K6ROQpWr34Aje81G0HfipiznLTB8vD4BO8sF6FEwx1KjJVdFkSmGZPmAhc6L1vZPs8TKY5BqoH72zG13zVzW2w==",
|
||||
"dependencies": {
|
||||
"NuGet.Common": "6.4.0",
|
||||
"NuGet.Versioning": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Packaging": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "aR10aYqcUMGC2mwMGH5rls/MGaz3EVH8DKTTHQ/EC91hXNtrCTTAQonaRR+v1EItcoxtQeZ/WQOorv4z270Tgg==",
|
||||
"dependencies": {
|
||||
"Newtonsoft.Json": "13.0.1",
|
||||
"NuGet.Configuration": "6.4.0",
|
||||
"NuGet.Versioning": "6.4.0",
|
||||
"System.Security.Cryptography.Cng": "5.0.0",
|
||||
"System.Security.Cryptography.Pkcs": "5.0.0"
|
||||
}
|
||||
},
|
||||
"NuGet.ProjectModel": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "eW9Q7vPk8cpXDd5b+vtIPkl8dSDCPkPJPrjXPTfZGxhstldnhJrj1XPaonsDZLQ24YY7LrYCzC0BiHh3iO5zUA==",
|
||||
"dependencies": {
|
||||
"NuGet.DependencyResolver.Core": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Protocol": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "KIPjsWP0P3EMsDsXaa6YBCTvYKur/zI0luS1kO5G37ci8mHs2kJFsuG5qaMhGvgyHASu54sxlic1n1oza2Pcbw==",
|
||||
"dependencies": {
|
||||
"NuGet.Packaging": "6.4.0"
|
||||
}
|
||||
},
|
||||
"NuGet.Versioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.4.0",
|
||||
"contentHash": "YE8p3TpX4jIw+Gb24maE8YRDoqWA4imLmCbdOj5IvslLrZJXQ8akeFOGOplxICNVevON1g1SFYT2+cq4yy0nQQ=="
|
||||
},
|
||||
"protobuf-net": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "kTGOK0E87473sOImOjgZOnz3kTC2aMLffoRWQLYNuBLJnwNNmjanF9IkevZ9Q7yYLeABQfcF3BpeepuMntMVNw=="
|
||||
},
|
||||
"System.Formats.Asn1": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w=="
|
||||
},
|
||||
"System.Security.Cryptography.Cng": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==",
|
||||
"dependencies": {
|
||||
"System.Formats.Asn1": "5.0.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Pkcs": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==",
|
||||
"dependencies": {
|
||||
"System.Formats.Asn1": "5.0.0",
|
||||
"System.Security.Cryptography.Cng": "5.0.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.ProtectedData": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.4.0",
|
||||
"contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog=="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user