如何解决NuGet PackageManager.InstallPackageAsync引发NullReferenceException
我正在开发一个基于Nuget构建的插件管理系统,类似于Chocolatey,PowerShell Gallery等。
我想使用较新的V3 libraries,而不要使用Chocolatey使用的已弃用的V2 Nuget.Core库。但是,V3库中的大量抽象和缺乏文档对我来说已成为一个严峻的挑战。我仍然无法获得可以下载并提取软件包的简单原型。
这是我的测试代码: https://github.com/ericanastas/nuget-packagemanagment-test
private static void Main(string[] args)
{
try
{
var curDir = System.IO.Directory.GetCurrentDirectory();
ISettings settings = Settings.LoadSpecificSettings(curDir,Settings.DefaultSettingsFileName);
List<Lazy<INuGetResourceProvider>> resourceProviders = new List<Lazy<INuGetResourceProvider>>();
resourceProviders.AddRange(NuGet.Protocol.Core.Types.Repository.Provider.GetCoreV3()); // Add v3 API support
IPackageSourceProvider packageSourceProvider = new PackageSourceProvider(settings);
SourceRepositoryProvider sourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider,resourceProviders);
string projectRoot = System.IO.Path.GetFullPath("ProjectRoot");
if (!System.IO.Directory.Exists(projectRoot)) System.IO.Directory.CreateDirectory(projectRoot);
FolderNuGetProject nuGetProject = new FolderNuGetProject(projectRoot);
string packagesFolderPath = System.IO.Path.GetFullPath("Packages");
if (!System.IO.Directory.Exists(packagesFolderPath)) System.IO.Directory.CreateDirectory(packagesFolderPath);
NuGetPackageManager packageManager = new NuGetPackageManager(sourceRepositoryProvider,settings,packagesFolderPath)
{
PackagesFolderNuGetProject = nuGetProject
};
bool allowPrereleaseVersions = true;
bool allowUnlisted = true;
DependencyBehavior dependencyBehavior = DependencyBehavior.Lowest;
ResolutionContext resolutionContext = new ResolutionContext(
dependencyBehavior,allowPrereleaseVersions,allowUnlisted,VersionConstraints.None);
INuGetProjectContext projectContext = new ConsoleProjectContext(NullLogger.Instance);
IEnumerable<SourceRepository> primarySourceRepositories = sourceRepositoryProvider.GetRepositories();
//packageIdentity
string packageId = "Newtonsoft.Json";
string packageVersion = "12.0.3";
PackageIdentity packageIdentity = new PackageIdentity(packageId,new NuGet.Versioning.NuGetVersion(packageVersion));
var installPackageAsyncTask = packageManager.InstallPackageAsync(packageManager.PackagesFolderNuGetProject,packageIdentity,resolutionContext,projectContext,primarySourceRepositories,Array.Empty<SourceRepository>(),CancellationToken.None);
installPackageAsyncTask.GetAwaiter().GetResult();
}
catch (Exception exp)
{
using (var sw = new System.IO.StreamWriter("error.txt"))
{
sw.Write(exp.ToString());
}
Console.WriteLine(exp.ToString());
throw;
}
}
这是我尝试致电NullReferenceException
时最后抛出的InstallPackageAsync()
System.NullReferenceException: Object reference not set to an instance of an object.
at NuGet.ProjectManagement.FolderNuGetProject.<>c__DisplayClass13_0.<<InstallPackageAsync>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.Common.ConcurrencyUtilities.<ExecuteWithFileLockedAsync>d__3`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at NuGet.Common.ConcurrencyUtilities.<ExecuteWithFileLockedAsync>d__3`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.NuGetPackageManager.<ExecuteInstallAsync>d__85.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at NuGet.PackageManagement.NuGetPackageManager.<ExecuteNuGetProjectActionsAsync>d__76.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at NuGet.PackageManagement.NuGetPackageManager.<ExecuteNuGetProjectActionsAsync>d__76.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at NuGet.PackageManagement.NuGetPackageManager.<ExecuteNuGetProjectActionsAsync>d__76.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.NuGetPackageManager.<InstallPackageAsync>d__48.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NuGet.PackageManagement.NuGetPackageManager.<InstallPackageAsync>d__47.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at NugetTest.Program.Main(String[] args) in C:\Git\5ec64809061464dc19a1d4e39961c565\NugetTest\Program.cs:line 66
我在这里想念什么?
解决方法
我目前也在纠结这个。我发现 this repository 的来源很有用。
要使示例代码正常工作,请将 projectContext
初始化更改为:
var clientPolicyContext = ClientPolicyContext.GetClientPolicy(settings,NullLogger.Instance);
INuGetProjectContext projectContext = new ConsoleProjectContext(NullLogger.Instance)
{
PackageExtractionContext = new PackageExtractionContext(
PackageSaveMode.Defaultv3,PackageExtractionBehavior.XmlDocFileSaveMode,clientPolicyContext,NullLogger.Instance
)
};
在生产代码中,您可能希望使用真正的记录器而不是 NullLogger
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。