如何在 Visual Studio 中启用 NuGet 包还原?

Posted

技术标签:

【中文标题】如何在 Visual Studio 中启用 NuGet 包还原?【英文标题】:How do I enable NuGet Package Restore in Visual Studio? 【发布时间】:2015-03-09 20:04:38 【问题描述】:

堆栈上有一个similar post,但它对我的问题没有帮助,可能是因为我使用的是 Visual Studio 2015。

如何让“启用 NuGet 包还原”选项出现在 VS2015 中?

我选择了文件 > 新建项目并创建了一个空的 ASP.NET Web 应用程序。我正在寻找这个菜单选项。

我应该提到,我已经在我的项目文件夹中查找了任何预先存在的 nuGet 文件,但没有。

【问题讨论】:

确保您是针对您的解决方案而不是 Web 项目尝试此操作。默认情况下,只有一个项目时不显示解决方案 是的,这绝对是一个容易犯的错误,但我确实确保检查解决方案,我认为它可能与 2015 年有关。当我遵循相同的步骤时,启用选项在 VS2013 中可用。 这里也一样。我什至尝试删除重新激活 VS 2013 中的 Enable NuGet Package Restore 选项的 .nuget 文件夹,但仍然没有骰子。我正在尝试打开在 VS 2013 中创建的现有 MVC 应用程序。 @justanotherdev 如果您提供对新工作流程的参考以使您的评论更有成效,那将会很有用。 我没有看到 oligofren 引用的 David Ebbo 的文章,所以我只是在 Notepad++ 中打开了 sln 和 csproj 文件并删除了他说明的部分。我在 VS2015 中打开了解决方案,保存文件后,VS 提示我重新加载它们,我的解决方案引用现在很好,我的解决方案可以编译。非常感谢,文尼! 【参考方案1】:

花了很长时间,但我终于在Migrating MSBuild-Integrated solutions to Automatic Package Restore 上找到了此文档,并且我能够使用此处描述的方法解决问题。

    从解决方案中删除 '.nuget' 解决方案目录 从.csproj.vbproj 文件中删除对nuget.targets 的所有引用。虽然没有官方支持,但如果您有很多需要清理的项目,该文档链接到PowerShell script。我手动编辑了我的,所以我无法就我的使用体验提供任何反馈。

手动编辑文件时,您会寻找以下内容:

解决方案文件 (.sln)

Project("2150E333-8FDC-42A3-9474-1A3956D46DE8") = ".nuget", ".nuget", "F4AEBB8B-A367-424E-8B14-F611C9667A85"
ProjectSection(SolutionItems) = preProject
    .nuget\NuGet.Config = .nuget\NuGet.Config
    .nuget\NuGet.exe = .nuget\NuGet.exe
    .nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject

项目文件 (.csproj / .vbproj)

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is 0.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>

【讨论】:

我在这里完全错过了一些东西。当我使用这种方法时,我会在我拥有的每个解决方案中安装大量软件包。我有一个包含 10 个包的解决方案和另一个包含完全相同包的解决方案:创建了两个不同的目录,每个目录都包含 10 个包。使用这种方法,如何将所有包合并到一个目录中(就像旧的 VS2013 方法允许通过编辑 NuGet.Config 文件)? 看不到 .nuget 文件夹?去看看关于删除包文件夹中的文件夹的解决方案。有可能你的包恢复了一半,而垃圾阻止了它完全恢复。 确实这是解决方案。除此之外 - 我在开始构建项目之前添加了“nuget restore”。 nuget 包会自动下载,之后项目构建工作正常。 为了节省一点时间,@VinneyKelly 提到的从 GitHub 存储库执行的脚本是 migrateToAutomaticPackageRestore.ps1,它的魔力,有效!【参考方案2】:

Microsoft 已放弃对 VS2015 中“启用 NuGet 包还原”的支持,您需要进行一些手动更改以迁移旧解决方案或将该功能添加到新解决方案中。 NuGet Package Restore 中很好地描述了新功能。

这里还有一个现有项目的迁移指南(如前所述):NuGet Migration Guide

升级时:

    不要删除 .nuget 目录。 删除 nuget.exe 和 nuget.targets 文件。 保留 nuget.config。 手动清除对 NuGet 目标的任何引用的每个项目文件。提到的 Powershell 脚本似乎弊大于利。

创建新项目时:

    在您的 Visual Studio 2015 解决方案中,创建一个名为 .nuget 的解决方案目录。

    创建解决方案目录的实际目录(.sln 文件所在的位置)并将其命名为 .nuget(请注意,解决方案目录与实际文件系统目录不同,即使它们具有相同的名称)。

    在 .nuget 目录中创建一个名为 nuget.config 的文件。

    将“nuget.config”添加到步骤 #2 中创建的解决方案目录。

    将以下文本放入 nuget.config 文件中:

    <?xml version="1.0" encoding="utf-8"?>
     <configuration>
      <config>
        <add key="repositorypath" value="$\..\..\..\..\Packages" />
      </config>
      <solution>
        <add key="disableSourceControlIntegration" value="true" />
      </solution>
    </configuration>
    

此配置文件将允许您将所有包合并到一个位置,这样您的文件系统上就不会出现同一个包的 20 个不同副本。相对路径会根据您的解决方案目录架构而改变,但它应该指向您所有解决方案共有的目录。

您需要在执行第 5 步后重新启动 Visual Studio。在您这样做之前,Nuget 不会识别更改。

最后,您可能必须使用“Nuget Package Manager for Solutions”卸载并重新安装这些包。我不知道这是我运行的 Powershell 脚本的副作用,还是只是让 NuGet 重新启动的一种方法。完成所有这些步骤后,当我从 TFVC 中签出项目时,我复杂的构建架构可以完美地关闭新包。

【讨论】:

为什么要删除 nuget.targets 文件,当它丢失时我会得到一致的构建吗? 目标现在似乎已集成到 IDE 中,以及“nugget.exe”过去提供的功能。您唯一需要的就是配置。 除了 DRAirey 提到的步骤之外,我还必须执行以下操作: 1) 使用 ../.. 而不是 $\..\..\..\..\Packages /(windows 父路径约定,开始时没有 $ 2)保存解决方案,关闭并重新打开,以便包安装读取和遵守 nuget.config 这有助于我的新 VS2015 项目,在该项目中我提交了包目录,而其他团队成员由于 NuGet 依赖项而无法重建。 您需要在执行第 5 步后重新启动 Visual Studio。在您这样做之前,Nuget 不会识别更改。【参考方案3】:

正如 Mike 已经提到的,在 VS2015 中没有“启用 NuGet 包还原”选项。您必须手动调用恢复过程。一个不错的方法 - 不弄乱文件和目录 - 使用 NuGet 包管理控制台:点击“快速启动”字段(通常在右上角),输入 console,打开管理控制台,输入命令:

Update-Package –reinstall

这将在您的解决方案中重新安装所有项目的所有包。要指定单个项目,请输入:

Update-Package –reinstall -ProjectName MyProject

当然,只有在 VS2015 提供的Restore 按钮(有时)不可用时才需要这样做。此处列出并解释了更多有用的更新命令:https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages

【讨论】:

非常感谢,我遇到了类似的问题。我刚刚通过您的程序解决了我的问题。非常感谢你 这里也一样,唯一一个有效的,不需要到处写一堆东西 这里最有用的答案!【参考方案4】:

您可以选择从“packages”文件夹中删除所有文件夹,然后选择“Manage NuGet Packages for Solution...”。在这种情况下,“还原”按钮会出现在 NuGet 包 Windows 上。

【讨论】:

删除“packages”文件夹中的文件夹后,尝试关闭并重新打开 NuGet Packages 窗口。 +1 这对我有用,请注意,恢复按钮会在窗口顶部弹出,就在选项卡的下方。说:“此解决方案中缺少一些 NuGet 包。单击以从您的在线包源恢复。” 如此简单易行..这对我有用..猜猜这应该是更多投票的答案:) 如此简单易行。这应该是答案。 为我工作。 :)【参考方案5】:

如果您有任何问题或缺少任何包,您只需在项目中右键单击并选择“Manage NuGet Packages for Solution...”。单击此按钮后,将打开一个屏幕,您会在其中看到一个显示“恢复”的菜单栏:

点击它会自动安装所需的包。 我相信这就是您正在寻找的,这解决了我的问题。

【讨论】:

但这只有在提示栏出现时才有帮助,在我的情况下没有。 手动安装软件包的步骤完全忽略了自动还原的要点。 我相信这应该是公认的答案,它的功能是一样的 我可以通过右键单击解决方案来查看恢复选项。它位于“管理用于解决方案的 NuGet 包”下。对我有用。 对我不起作用 - 我在解决方案中看到有关缺少 nuget 包的警告,但管理 nuget 包并没有为我提供下载它们的选项。我也无法构建和恢复。恢复命令也不做任何事情。【参考方案6】:

使用此命令恢复所有包

dotnet restore

【讨论】:

【参考方案7】:

将带有 nuget 包的项目从 Vx20XX 升级到 VS2015 时,您可能会遇到 nuget 包的问题。

错误信息示例: 此项目引用此计算机上缺少的 NuGet 包。启用 NuGet 包还原以下载它们。

2016-02-06 更新:我有一个指向该信息的链接,但它不再起作用了。我怀疑最近的一条路径已经解决了这个问题???

我写了一个小程序来解决我的问题MSBuild-Integrated package restore vs. Automatic Package Restore

您可以下载工具here的可执行文件。

请告诉我结果:-)!

代码作为参考:

<Window x:Class="FixNuGetProblemsInVs2015.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FixNuGetProblemsInVs2015"
        mc:Ignorable="d"
        Title="Fix NuGet Packages problems in Visual Studio 2015 (By Eric Ouellet)" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="10"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0">Root directory of projects</TextBlock>
        <Grid Grid.Row="0" Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <TextBox Grid.Column="0" Name="DirProjects"></TextBox>
            <Button Grid.Column="1" VerticalAlignment="Bottom" Name="BrowseDirProjects" Click="BrowseDirProjectsOnClick">Browse...</Button>
        </Grid>

        <!--<TextBlock Grid.Row="1" Grid.Column="0">Directory of NuGet Packages</TextBlock>
        <Grid Grid.Row="1" Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <TextBox Grid.Column="0" Name="DirPackages"></TextBox>
            <Button Grid.Column="1"  Name="BrowseDirPackages" Click="BrowseDirPackagesOnClick">Browse...</Button>
        </Grid>-->

        <TextBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Name="TxtLog" IsReadOnly="True"></TextBox>

        <Button Grid.Row="3" Grid.Column="0" Click="ButtonRevertOnClick">Revert back</Button>
        <Button Grid.Row="3" Grid.Column="2" Click="ButtonFixOnClick">Fix</Button>
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Linq;
using Application = System.Windows.Application;
using MessageBox = System.Windows.MessageBox;

/// <summary>
/// Applying recommanded modifications in section : "MSBuild-Integrated package restore vs. Automatic Package Restore"
/// of : http://docs.nuget.org/Consume/Package-Restore/Migrating-to-Automatic-Package-Restore
/// </summary>

namespace FixNuGetProblemsInVs2015

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();

            DirProjects.Text = @"c:\prj";
            // DirPackages.Text = @"C:\PRJ\NuGetPackages";
        

        private void BrowseDirProjectsOnClick(object sender, RoutedEventArgs e)
        
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            dlg.SelectedPath = DirProjects.Text;
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            
                DirProjects.Text = dlg.SelectedPath;
            
        

        //private void BrowseDirPackagesOnClick(object sender, RoutedEventArgs e)
        //
        //  FolderBrowserDialog dlg = new FolderBrowserDialog();
        //  dlg.SelectedPath = DirPackages.Text;
        //  if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        //  
        //      DirPackages.Text = dlg.SelectedPath;
        //  
        //

        // private string _dirPackages;

        private void ButtonFixOnClick(object sender, RoutedEventArgs e)
        
            DoJob(false);
        

        private void ButtonRevertOnClick(object sender, RoutedEventArgs e)
        
            DoJob(true);
        

        private void DoJob(bool revert = false)
        
            TxtLog.Text = "";

            string dirProjects = DirProjects.Text;
            // _dirPackages = DirPackages.Text;

            if (!Directory.Exists(dirProjects))
            
                MessageBox.Show("Projects directory does not exists: " + dirProjects);
                return;
            

            //if (!Directory.Exists(_dirPackages))
            //
            //  MessageBox.Show("Packages directory does not exists: " + _dirPackages);
            //  return;
            //

            RecurseFolder(dirProjects, revert);
        

        private void RecurseFolder(string dirProjects, bool revert = false)
        
            if (revert)
            
                Revert(dirProjects);
            
            else
            
                FixFolder(dirProjects);
            

            foreach (string subfolder in Directory.EnumerateDirectories(dirProjects))
            
                RecurseFolder(subfolder, revert);
            
        

        private const string BackupSuffix = ".fix_nuget_backup";

        private void Revert(string dirProject)
        
            foreach (string filename in Directory.EnumerateFiles(dirProject))
            
                if (filename.ToLower().EndsWith(BackupSuffix))
                
                    string original = filename.Substring(0, filename.Length - BackupSuffix.Length);
                    if (File.Exists(original))
                    
                        File.Delete(original);                                          
                    
                    File.Move(filename, original);
                    Log("File reverted: " + filename + " ==> " + original);
                
            
        

        private void FixFolder(string dirProject)
        
            BackupFile(System.IO.Path.Combine(dirProject, "nuget.targets"));
            BackupFile(System.IO.Path.Combine(dirProject, "nuget.exe"));

            foreach (string filename in Directory.EnumerateFiles(dirProject))
            
                if (filename.ToLower().EndsWith(".csproj"))
                
                    FromProjectFileRemoveNugetTargets(filename);
                
            
        

        private void BackupFile(string path)
        
            if (File.Exists(path))
            
                string backup = path + BackupSuffix;
                if (!File.Exists(backup))
                
                    File.Move(path, backup);
                    Log("File backup: " + backup);
                
                else
                
                    Log("Project has already a backup: " + backup);
                
            
        

        private void FromProjectFileRemoveNugetTargets(string prjFilename)
        
            XDocument xml = XDocument.Load(prjFilename);

            List<XElement> elementsToRemove = new List<XElement>();

            foreach (XElement element in xml.Descendants())
            
                if (element.Name.LocalName == "Import")
                
                    var att = element.Attribute("Project");
                    if (att != null)
                    
                        if (att.Value.Contains("NuGet.targets"))
                        
                            elementsToRemove.Add(element);
                        
                    
                

                if (element.Name.LocalName == "Target")
                
                    var att = element.Attribute("Name");
                    if (att != null && att.Value == "EnsureNuGetPackageBuildImports")
                    
                        elementsToRemove.Add(element);
                    
                
            

            if (elementsToRemove.Count > 0)
            
                elementsToRemove.ForEach(element => element.Remove());
                BackupFile(prjFilename);
                xml.Save(prjFilename);
                Log("Project updated: " + prjFilename);
            
        

        private void Log(string msg)
        
            TxtLog.Text += msg + "\r\n";
        

    

【讨论】:

该程序可以很好地转换我的解决方案中的大量项目。最新版本也有一个“NuGet 包目录”字段,但似乎不影响输出。它有什么作用? 对不起,我不知道。我怀疑这将取决于文件的内容。也许您可以跟踪函数:“FromProjectFileRemoveNugetTargets”并查看您的文件是否会受到影响?抱歉这个不好的答案,我不记得我编码了什么:-(!我只知道我在两台不同的计算机上成功使用了两次。【参考方案8】:

我在尝试构建示例项目 gplus-quickstart-csharp-master 时遇到了同样的问题。

我仔细查看了错误消息并找到了克服此错误的解决方法,希望这会有所帮助。

右键单击解决方案文件并在 Windows 资源管理器中打开。 使用NuGet.Config、NuGet.exe、NuGet.targets复制.nuget文件夹(下载link或直接从其他项目复制并替换) 尝试重建解决方案。

享受吧!

【讨论】:

【参考方案9】:

我想对于 asp.net 4 项目,我们正在转向自动恢复,所以没有必要这样做。对于较旧的项目,我认为需要做一些转换工作。

http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore

【讨论】:

你可能是对的。我刚刚尝试使用 VS2013 中完全相同的步骤创建项目,并且“启用 Nuget 包还原”就在那里。谢谢你的链接,我现在去看看。【参考方案10】:

查看 Visual Studio 中的参考并查看缺少哪些包。 现在右键单击 Visual 中的解决方案,然后单击文件资源管理器中的打开文件夹。 现在打开包文件夹并删除丢失的包文件夹。 打开 Visual Studio 并构建解决方案。所有丢失的包都将被恢复。 如果我有帮助,请将此标记为答案。

【讨论】:

【参考方案11】:

这种方法对我有用:

关闭VS2015 在 VS2013 中临时打开解决方案,并通过右键单击解决方案启用 nuget 包恢复(我也进行了重建,但我怀疑不需要这样做)。 关闭VS2013 在VS2015中重新打开解决方案

您现在也已在 VS2015 中启用 nuget 包恢复

【讨论】:

【参考方案12】:

Ivan Branets 的解决方案基本上为我解决了这个问题,但可以分享更多细节。

就我而言,我在 VS 2015 中使用 Auto Package restoreTFS。这都是非常默认的东西。

问题在于,当另一位开发人员尝试从 TFS 获得解决方案时,某些软件包并未完全恢复。 (为什么,我还不太确定。)但是 packages 文件夹包含一个用于引用的文件夹和 NuGet 包,但它没有得到扩展(比如缺少一个包含 .dll 的 lib 文件夹。)这一半在那里,但不完全正确的概念是阻止包被恢复。

您会认识到这一点,因为引用将带有一个黄色感叹号,表示未解决。

因此,删除包中的文件夹解决方案消除了包还原阻止问题。然后您可以右键单击***解决方案以获取恢复包的选项,现在它应该可以工作了。

【讨论】:

【参考方案13】:

关闭 VS。删除包文件夹下的所有内容。重新打开您的解决方案。右键单击您的项目,选择“管理 nuget 包...”。您将看到“Nuget 包管理器”窗口顶部出现一个黄色条,要求您恢复包。这对我有用。

【讨论】:

【参考方案14】:

包管理器控制台(Visual Studio、工具 > NuGet 包管理器 > 包管理器控制台):运行 Update-Package -reinstall -ProjectName 命令,其中受影响项目的名称显示在解决方案资源管理器中。使用 Update-Package -reinstall 自行恢复解决方案中的所有包。请参阅更新包。如果需要,您还可以重新安装单个软件包。

来自https://docs.microsoft.com/en-us/nuget/quickstart/restore

【讨论】:

【参考方案15】:

如果其他人在 Visual Studio 2017 中发现此问题,请确保项目是由 .sln 文件而不是文件夹打开的,因为如果文件夹打开,Visual Studio 将不会获取设置。如果您使用 git 的 Visual Studio 在线服务,默认情况下会发生这种情况。

【讨论】:

【参考方案16】:

如果所有其他方法都失败了(或者可能在此之前),您可能需要检查 NuGet 是否是包源。我安装了 VS2017,默认情况下它不存在。我觉得这有点奇怪。

    工具 - NuGet 包管理器 - 包管理器设置 点击对话框左侧导航中的“包源”。 使用加号 (+) 添加 Nuget URL:https://api.nuget.org/v3/index.json

【讨论】:

【参考方案17】:

也可能是在您尝试安装软件包时运行程序的结果。如果您尝试在内置 IIS 在后台运行时单击它,它会灰显。

【讨论】:

【参考方案18】:

对于.NET Core 项目,在NuGet Package Manager Console 中运行dotnet restoredotnet build 命令(自动运行恢复)

您可以从

运行控制台

工具 > NuGet 包管理器 > 包管理器控制台

【讨论】:

【参考方案19】:

我使用了msbuild /t:restore


来源和来源:

我的问题在于 MSBuild 所以我关注了 @Vinney Kelly 的链接:Migrating MSBuild-Integrated solutions to Automatic Package Restore

还有……

这就像一个魅力 =]

MSBuild:使用msbuild /t:restore 命令,恢复包 项目文件中列出的包(仅限PackageReference)。可用的 仅在 NuGet 4.x+ 和 MSBuild 15.1+ 中,它们包含在 Visual2017 年工作室nuget restoredotnet restore 都使用这个命令 适用项目。

【讨论】:

在我的情况下 /t:restore 没有构建我必须使用 /restore 命令的项目【参考方案20】:

针对 .NET Core 3.1 的 VS 2019 版本 16.4.4 解决方案

在尝试了这里提出的几乎所有解决方案之后,我关闭了 VS。 当我重新打开它时,几秒钟后一切恢复正常......

【讨论】:

【参考方案21】:

我不得不删除 packages 文件夹关闭并重新打开 (VS2015) 解决方案。我没有迁移,也没有将包签入源代码管理。我只能说有些事情搞砸了,这解决了它。

【讨论】:

【参考方案22】:

通过工具 >>> Nuget包管理器 >>> 常规帮助我,然后勾选选项允许Nuget下载丢失的包在 Visual Studio 中构建期间自动检查丢失的包

【讨论】:

【参考方案23】:

我也面临同样的问题。我正在尝试将在 Visual Studio 2015 上创建的 MVC 项目添加到我在 Visual Studio 2019 上创建的解决方案中。

Visual Studio 2019 上已有项目,因此添加我在 VS 2015 上创建的现有项目会触发同样的错误。我已经在这里尝试了所有答案,但它并没有解决问题。

我所做的只是将 .nuget 文件夹放在解决方案文件夹中。原来文件夹的层次结构是这样的:

Solution Folder (VS 2019)
  -> MVC 1 Project
  -> MVC 2 Project
  -> MVC 3 Project (Project that I am adding)
         -> .nuget folder (It contains a .nuget folder)

因此,当我将 .nuget 文件夹移动到解决方案文件夹本身时,问题得到了解决:

    Solution Folder (VS 2019)
  -> MVC 1 Project
  -> MVC 2 Project
  -> MVC 3 Project (Project that I am adding)
  -> .nuget folder (It contains a .nuget folder)

【讨论】:

【参考方案24】:

更简单的是,将 .nuget 文件夹添加到您的解决方案中,然后会出现“恢复 Nuget 包”(不确定是否需要存在 nuget.exe 才能使其工作)。

【讨论】:

以上是关于如何在 Visual Studio 中启用 NuGet 包还原?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2017 中启用 TFS 跟踪

如何在 Visual Studio 中启用 NuGet 包还原?

如何在 Visual Studio 中(重新)启用实时 CSS 编辑?

如何在 Visual Studio 2019 中启用编译器警告?

如何在 Visual Studio 2013 中启用 C# 6.0 功能?

如何在 Visual Studio 2015 中启用 WiX 项目