C#以编程方式恢复NuGet包

时间:2017-11-30 20:42:02

标签: c# nuget

给定解决方案文件的字符串文件路径,例如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();
    }
}

1 个答案:

答案 0 :(得分:2)

不确定代码的运行位置。只是外壳到NuGet.exe并恢复解决方案而不是尝试使用Visual Studio API可能更简单。您链接到的API仅在您作为扩展名在Visual Studio中运行或在包管理器控制台窗口中运行时才可用。

如果您编写的代码未在Visual Studio中运行,请说它是一个控制台应用程序,那么运行nuget.exe会更容易。否则,您可以查看可用的各种NuGet包,并提供API来执行各种NuGet操作。但是,运行nuget.exe还原要简单得多。