如何在Visual Studio中启用NuGet包恢复?

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

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

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

enter image description here

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

447438 次浏览

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

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

如果你有任何问题或缺少任何包,你可以简单地右键单击你的项目并选择“管理解决方案的NuGet包…”。点击后,屏幕会打开,你会看到一个菜单栏上写着“还原”: < img src = " https://i.imgur.com/cbXbpMx.png " alt = "恢复" / > < / p >

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

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

  1. 从解决方案中删除'.nuget'解决方案目录
  2. 从你的.csproj.vbproj文件中删除所有对nuget.targets的引用。虽然不受官方支持,但如果你有很多需要清理的项目,文档会链接到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迁移指南

当升级:

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

创建新项目时:

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

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

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

  4. 添加'nuget。Config '到步骤#2中创建的解决方案目录。

  5. 将以下文本放入块中。配置文件:

    <?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包还原来下载它们。< / p >

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

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

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

请让我知道结果!

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


}
}

伊凡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。Config, NuGet.exe, NuGet.targets复制.nuget文件夹(下载链接或简单地从其他项目复制并替换)
  • 尝试重新构建解决方案。

享受! !

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

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

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

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

Update-Package –reinstall

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

Update-Package –reinstall -ProjectName MyProject

当然,这只在VS2015提供的Restore按钮不可用时才有必要。下面列出并解释了更多有用的更新命令

包管理器控制台(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凯利的链接:将msbuild集成解决方案迁移到自动包恢复

和…

这招很管用=]

MSBuild:使用msbuild /t:restore命令恢复包 项目文件中列出的包(仅限于PackageReference)。可用 只有在NuGet 4。x+和MSBuild 15.1+,它们包含在视觉Studio 2017nuget restoredotnet restore都使用这个命令

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

enter image description here

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

您可以从运行控制台

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

使用此命令恢复所有包

dotnet restore

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

  1. 工具- NuGet包管理器-包管理器设置
  2. 点击对话框左侧导航的“包源”。
  3. 使用加号(+)添加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。 当我重新打开它时,几秒钟后一切都恢复正常了

如果包restore在从visual studio构建应用程序时没有自动发生,或者试图从visual studio UI或package manager console restore构建应用程序时,请从command line尝试。

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

一旦完成,cd到项目/解决方案package.config文件存在的路径,并运行下面的命令。

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

这里,-PackagesDirectory .\Packages一起表示还原的output将保存在项目根级名为Packages的新文件夹中。

欲了解更多内容,请查看微软文档参考