给定解决方案文件的字符串文件路径,例如C:\ Foo.sln,您如何以编程方式恢复该解决方案的NuGet包?我试图关注this guide,但发现它很糟糕。
按照文章推荐的那样安装NuGet包NuGet.VisualStudio后,我挣扎着尝试恢复包。
这是我到目前为止的代码:
// requires reference to System.ComponentModel.Composition
[Import(typeof(IVsPackageRestorer))]
private static IVsPackageRestorer packageInstaller;
然后尝试使用它(似乎需要EnvDTE参考)(以及如何使用这种魔法" GetService"方法 - 它来自哪里?):
private static void RestorePackages(string solutionPath)
{
// Using the IComponentModel service
// https://docs.microsoft.com/en-us/nuget/visual-studio-extensibility/nuget-api-in-visual-studio#ivspackagerestorer-interface
// How do I get the project? Can I do this at the solution level or do I have to get all projects under the solution?
EnvDTE.Project project = null;
packageInstaller.RestorePackages(project);
////What is this code??? What is GetService???
////var componentModel = (IComponentModel)GetService(typeof(SComponentModel));
////IVsPackageRestorer packageRestorer = componentModel.GetService<IVsPackageRestorer>();
////packageRestorer.RestorePackages(project);
}
编辑/解决方案:使用马特沃德的建议,代码来&#34; shell out&#34;在我的情况下,nuget.exe看起来像以下方法,根据解决方案的完整路径恢复包。
private static void RestorePackages(string solutionPath)
{
using (Process process = new Process())
{
process.StartInfo = new ProcessStartInfo
{
FileName = "nuget.exe",
Arguments = $"restore {solutionPath}",
UseShellExecute = false,
CreateNoWindow = true
};
process.Start();
process.WaitForExit();
}
}
答案 0 :(得分:2)
不确定代码的运行位置。只是外壳到NuGet.exe并恢复解决方案而不是尝试使用Visual Studio API可能更简单。您链接到的API仅在您作为扩展名在Visual Studio中运行或在包管理器控制台窗口中运行时才可用。
如果您编写的代码未在Visual Studio中运行,请说它是一个控制台应用程序,那么运行nuget.exe会更容易。否则,您可以查看可用的各种NuGet包,并提供API来执行各种NuGet操作。但是,运行nuget.exe还原要简单得多。