关于堆栈有一个类似的帖子,但它可能对我的问题没有帮助,因为我使用的是Visual Studio 2015。

如何在VS2015中显示“启用NuGet包恢复”选项?

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

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


我想对于asp.net 4项目,我们将转向自动恢复,所以不需要这样做。对于较老的项目,我认为需要进行一些转换。

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

如果你有任何问题或缺少任何包,你可以简单地右键单击你的项目,选择“管理NuGet包的解决方案…”。点击后,屏幕会打开,你会看到一个菜单栏上写着“还原”:

单击它,所需的软件包将自动安装。 我相信这就是你要找的,这解决了我的问题。

花了很长时间,但我最终找到了这个关于将msbuild集成解决方案迁移到自动包恢复的文档,我能够使用这里描述的方法解决这个问题。

去掉'。Nuget的解决方案目录从解决方案 删除对nuget的所有引用。目标从你的。csproj或。vbproj文件。虽然不受官方支持,但如果您有很多需要清理的项目,该文档会链接到一个PowerShell脚本。我手动编辑了我的,所以我不能就我的体验给出任何反馈。

当你手动编辑你的文件时,下面是你要找的:

方案文件(.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>

您可以选择从“packages”文件夹中删除所有文件夹,并选择“Manage NuGet packages for Solution…”。在这种情况下,“恢复”按钮出现在NuGet Packages Windows上。

微软已经在VS2015中放弃了对“启用NuGet包恢复”的支持,你需要做一些手动更改来迁移旧的解决方案或将该功能添加到新的解决方案中。这个新特性在NuGet包还原中有很好的描述。

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

当升级:

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

创建新项目时:

In your Visual Studio 2015 solution, create a Solution Directory called .nuget. Create an actual directory of the solution directory (where the .sln file lives) and call it .nuget (note that the solution directory is not the same as the actual file system directory even though they have the same name). Create a file in the .nuget directory called nuget.config. Add the 'nuget.config' to the solution directory created in step #2. Place the following text in the nuget.config file: <?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包管理器的解决方案”卸载,然后重新安装包。我不知道这是否是我运行的Powershell脚本的副作用,或者只是踢NuGet回到齿轮的方法。当我完成了所有这些步骤后,当我从TFVC签出项目时,我复杂的构建体系结构完美地运行了新的包。

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

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

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

我解决了我的问题,写了一个小程序,做msbuild集成包恢复vs.自动包恢复

您可以在这里下载该工具的可执行文件。

请让我知道结果!

代码参考:

<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";
        }

    }
}

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

在我的情况下,我在VS 2015使用自动包恢复和TFS。这些都是默认的东西。

问题是,当另一个开发人员试图从TFS获得解决方案时,一些包没有完全恢复。(为什么,我还不太确定。)但是packages文件夹包含了一个用于引用和NuGet包的文件夹,但是它没有被展开(比如一个包含.dll的lib文件夹丢失了)。这一半,但不是很正确的概念阻止了包装的恢复。

您可以认出这一点,因为该引用将有一个黄色感叹号,表示未被解析。

因此,删除包中的文件夹的解决方案消除了包恢复阻塞问题。然后,您可以在顶部解决方案级别上单击右键,以获得恢复包的选项,现在它应该可以工作了。

更简单的是,在解决方案中添加一个. Nuget文件夹,然后就会出现“还原Nuget包”(不确定是否需要Nuget .exe才能正常工作)。

去visual studio的参考,看看哪些包丢失了。 现在在可视化中右键单击解决方案,然后在文件资源管理器中单击打开的文件夹。 现在打开包文件夹,删除丢失的包文件夹。 打开visual studio并构建解决方案。所有丢失的包都将被恢复。 如果我帮忙了,请把这个标记为答案。

这个方法对我很有效:

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

你现在已经在VS2015中启用了nuget包恢复。

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

我仔细查看了错误信息,并从克服这个错误中找到了一个解决方案,希望这将有所帮助。

右键单击解决方案文件并在windows资源管理器中打开。 用NuGet复制. NuGet文件夹。Config, NuGet.exe, NuGet。目标(下载链接或简单地从其他项目复制并替换) 尝试重新构建解决方案。

享受! !

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

也可能是在试图安装软件包时运行该程序的结果。当内置的IIS在后台运行时,如果你试图点击它,它会变成灰色。

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

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

Update-Package –reinstall

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

Update-Package –reinstall -ProjectName MyProject

当然,这只是在恢复按钮(有时由VS2015提供)不可用时才有必要。这里列出并解释了更多有用的更新命令:https://learn.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages

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

从https://learn.microsoft.com/en-us/nuget/quickstart/restore

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

我使用msbuild /t:restore。


资料来源:

我的问题是用MSBuild 所以我遵循了@Vinney Kelly的链接:将msbuild集成解决方案迁移到自动包恢复

和…

这招很管用=]

MSBuild:使用MSBuild /t:restore命令恢复包 项目文件中列出的包(仅限PackageReference)。可用 只有在NuGet 4。和MSBuild 15.1+,它们包含在Visual . x+中 2017工作室。Nuget restore和dotnet restore都使用该命令 适用项目。

帮助我通过工具>>> Nuget包管理>>>一般然后勾选选项允许Nuget下载丢失的包和自动检查丢失的包在visual studio中构建。

对于.NET核心项目,在NuGet包管理器控制台中运行dotnet restore或dotnet build命令(会自动运行恢复)

您可以从运行控制台

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

使用此命令恢复所有包

dotnet restore

如果所有这些都失败了(或者在此之前),您可能需要检查并查看NuGet是否是包源代码。我安装了VS2017,默认情况下它不在那里。我觉得有点奇怪。

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

我也面临着同样的问题。我试图将在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)

针对。net Core 3.1的VS 2019版本16.4.4解决方案

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

如果在从visual studio构建应用程序时,或者试图从visual studio UI或包管理器控制台恢复应用程序时,包恢复没有自动发生,请尝试从命令行进行恢复。

检查是否在您的机器中安装了nuget,如果没有,请尝试从这里安装它,或者您可以下载nuget.exe并将其放在项目/解决方案的根目录中。

完成之后,CD到项目/解决方案包所在的路径。配置文件存在,执行以下命令。

nuget.exe restore <projectname>\packages.config -PackagesDirectory .\Packages

这里,-PackagesDirectory .\Packages组合在一起意味着恢复的输出将保存在名为Packages的新文件夹中,位于项目根级。

欲了解更多,请参阅微软文档参考