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

时间:2015-01-12 04:54:03

标签: c# asp.net nuget visual-studio-2015 nuget-package-restore

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

如何获得"启用NuGet包恢复"选项出现在VS2015中?

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

enter image description here

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

24 个答案:

答案 0 :(得分:233)

花了太长时间,但我终于在Migrating MSBuild-Integrated solutions to Automatic Package Restore找到了这个文件,我能够使用这里描述的方法解决问题。

  1. 从解决方案中删除'.nuget'解决方案目录
  2. nuget.targets.csproj文件中删除对.vbproj的所有引用。虽然没有得到官方支持,但如果您有许多需要清理的项目,该文档会链接到PowerShell script。我手动编辑了我的手册,所以我不能就我的经验给出任何反馈。
  3. 手动编辑文件时,以下是您要查找的内容:

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

答案 1 :(得分:58)

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

此处还有现有项目的迁移指南(如前所述):NuGet Migration Guide

升级时:

  1. 不要删除.nuget目录。
  2. 删除nuget.exe和nuget.targets文件。
  3. 离开nuget.config。
  4. 手动清除对NuGet目标的任何引用的每个项目文件。提到的Powershell脚本似乎造成了更大的损害。
  5. 创建新项目时:

    1. 在Visual Studio 2015解决方案中,创建名为.nuget。
    2. 的解决方案目录
    3. 创建解决方案目录的实际目录(.sln文件所在的目录)并将其命名为.nuget(请注意,解决方案目录与实际文件系统目录不同,即使它们具有相同的名称)。 / LI>
    4. 在名为nuget.config的.nuget目录中创建一个文件。

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

    6. 将以下文本放在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>

    7. 此配置文件允许您在一个位置合并所有软件包,因此您的文件系统上没有20个不同的同一软件包副本。相对路径将根据您的解决方案目录体系结构而变化,但它应指向您所有解决方案通用的目录。

      执行第5步后,您需要重新启动visual studio.Nuget在您执行此操作之前无法识别更改。

      最后,您可能必须使用'Nuget Package Manager for Solutions'来卸载然后重新安装软件包。我不知道这是否是我运行的Powershell脚本的副作用,或者只是一种让NuGet重新投入使用的方法。一旦我完成了所有这些步骤,当我从TFVC检查项目时,我的复杂构建体系结构在完成新程序包时可以完美运行。

答案 2 :(得分:31)

您可以选择从&#34;包中删除所有文件夹&#34;文件夹并选择&#34;管理解决方案的NuGet包...&#34;。在这种情况下&#34;恢复&#34;按钮出现在NuGet Packages Windows上。

答案 3 :(得分:13)

正如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 :(得分:12)

如果您遇到任何问题或缺少任何软件包,只需右键单击项目并选择“管理NuGet软件包以获得解决方案...... ”。单击此按钮后,将打开一个屏幕,您会看到菜单栏中显示“恢复”: Restore

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

答案 5 :(得分:6)

使用nuget软件包从Vx20XX升级到VS2015的项目时,您可能会遇到nuget软件包问题。

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

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

我修复了编写一个MSBuild-Integrated package restore vs. Automatic Package Restore

的小程序的问题

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

请让我知道结果:-)!

enter image description 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";
        }

    }
}

答案 6 :(得分:5)

转到visual studio中的References,看看哪些包丢失了。 现在右键单击Visual中的Solution,然后单击文件资源管理器中的打开文件夹。 现在打开包文件夹并删除丢失的包文件夹。 打开visual studio,然后构建解决方案。所有丢失的包都将被恢复。 如果我帮忙,请将此标记为答案。

答案 7 :(得分:4)

我认为对于asp.net 4项目,我们正在转向自动恢复,因此不需要这样做。对于较旧的项目,我认为需要进行一些转换工作。

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

答案 8 :(得分:4)

这种方法对我有用:

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

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

答案 9 :(得分:4)

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

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

  • 右键单击解决方案文件,然后在Windows资源管理器中打开。
  • 使用 NuGet.Config,NuGet.exe,NuGet.targets 复制 .nuget 文件夹(下载link或只是从其他项目复制并替换)< / LI>
  • 尝试重建解决方案。

享受!!

答案 10 :(得分:3)

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

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

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

您会认识到这一点,因为该引用会有一个关于未解析的黄色感叹号。

因此,删除软件包中的文件夹解决方案会消除软件包还原阻止问题。然后,您可以右键单击顶级解决方案级别以获得还原包的选项,现在它可以正常运行。

答案 11 :(得分:3)

关闭VS.删除packages文件夹下的所有内容重新打开您的解决方案。右键单击您的项目,选择&#39; Manage nuget packages ...&#39;。你会看到一个黄色栏出现在Nuget Package Manager&#39;窗口,要求你恢复包。这对我有用。

答案 12 :(得分:2)

使用此命令还原所有软件包

dotnet restore

答案 13 :(得分:2)

  

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

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

答案 14 :(得分:1)

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

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

对于 .NET Core项目,请在dotnet restore中运行dotnet buildNuGet Package Manager Console命令(该命令会自动运行还原)

您可以通过以下方式运行控制台

  

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

答案 17 :(得分:1)

我使用了msbuild /t:restore


信用和来源:

我的问题是MSBuild 因此,我遵循了 @Vinney Kelly 的链接:Migrating MSBuild-Integrated solutions to Automatic Package Restore

和...

那很奏效=>

  

MSBuild :使用msbuild /t:restore命令来还原软件包   项目文件中列出的软件包(仅 PackageReference )。可用的   仅在 Visual 附带的NuGet 4.x +和MSBuild 15.1+中    Studio 2017 nuget restoredotnet restore都使用此命令   适用的项目。

答案 18 :(得分:1)

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

答案 19 :(得分:1)

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

答案 20 :(得分:0)

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

enter image description here

答案 21 :(得分:0)

我不得不删除package文件夹关闭并重新打开(VS2015)解决方案。我没有迁移,我没有将包检入源代码控制。我只能说是搞砸了,这就解决了。

答案 22 :(得分:0)

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

答案 23 :(得分:-4)

更简单的是,将.nuget文件夹添加到您的解决方案中并显示“Restore Nuget Packages”(不确定是否需要nuget.exe才能使其正常工作)。