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

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

如何获得VS2015中的“启用NuGet软件包还原”选项?

我select了File> New Project,并创build了一个空的ASP.NET Web应用程序 。 我正在寻找这个菜单选项。

在这里输入图像描述

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

这花了太长的时间,但是我终于find了关于将MSBuild集成的解决scheme迁移到Automatic Package Restore的文档,并且能够使用这里描述的方法来解决这个问题。

  1. 从解决scheme中除去'.nuget'解决scheme目录
  2. .csproj.vbproj文件中删除对nuget.targets所有引用。 虽然没有正式的支持,但是如果你有很多项目需要清理的话,这个文档就会链接到一个PowerShell脚本 。 我手工编辑我的手,所以我不能给我任何反馈与我的经验。

手动编辑文件时,以下是您要查找的内容:

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

微软已经放弃了对VS2015中的“启用NuGet软件包还原”的支持,并且需要做一些手动更改,以便迁移旧的解决scheme或者将function添加到新的解决scheme中。 NuGet软件包还原中描述的新function非常好。

现在也有移植指南(如前所述): NuGet移植指南

升级时:

  1. 不要删除.nuget目录。
  2. 删除nuget.exe和nuget.targets文件。
  3. 离开nuget.config。
  4. 手动清除对NuGet目标的任何引用的每个项目文件。 提到的Powershell脚本似乎做的更多的伤害比好。

创build新项目时:

  1. 在您的Visual Studio 2015解决scheme中,创build一个名为.nuget的解决scheme目录。
  2. 创build解决scheme目录(.sln文件所在的目录)的实际目录,并将其称为.nuget(注意即使它们具有相同的名称,解决scheme目录与实际的文件系统目录也不相同)。
  3. 在名为nuget.config的.nuget目录中创build一个文件。

  4. 将'nuget.config'添加到在步骤#2中创build的解决scheme目录中。

  5. 在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>

此configuration文件将允许您将所有软件包整合到一个位置,因此您的文件系统上不会有20个不同的相同软件包副本。 相对path将根据您的解决scheme目录体系结构而改变,但它应该指向所有解决scheme共有的目录。

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

最后,您可能需要使用“解决scheme的Nuget包pipe理器”来卸载并重新安装包。 我不知道这是否是我运行的Powershell脚本的一个副作用,或者只是一个方法来重新启动NuGet。 一旦我完成了所有这些步骤,我复杂的构build体系结构在我从TFVC中检查项目时完美地打包了新的包。

或者,您可以从“包”文件夹中删除所有文件夹,然后select“pipe理NuGet包的解决scheme…”。 在这种情况下,“恢复”button出现在NuGet软件包窗口上。

如果您有任何问题或缺less任何软件包,只需右键单击您的项目,然后select“ pipe理NuGet软件包的解决scheme… ”。 点击这个屏幕后,你会看到一个菜单栏显示“Restore”: 恢复

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

使用nux包将项目从Vx20XX升级到VS2015时,nuget包可能有问题。

错误消息示例:此项目引用此计算机上缺less的NuGet程序包。 启用NuGet软件包还原以下载它们。

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

我解决了我的问题写一个小程序,做MSBuild的集成软件包还原与自动软件包还原

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

请让我知道结果:-)!

在这里输入图像描述

代码作为参考:

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

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

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

在Visual Studio中的References中查看哪些包丢失。 现在右键单击Visual中的解决scheme,然后单击文件资源pipe理器中打开的文件夹 现在打开包文件夹并删除缺less的包文件夹。 打开视觉工作室,只是build立解决scheme。 所有缺less的软件包将被恢复。 如果我帮忙,请把这个标记为答案。

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

我仔细看了一下错误信息,发现了解决这个错误的解决办法,希望这会有所帮助。

  • 右键单击解决scheme文件并在Windows资源pipe理器中打开。
  • 复制.nu​​get文件夹与NuGet.Config,NuGet.exe,NuGet.targets (下载链接或只是从其他项目复制和replace)
  • 尝试重build解决scheme。

请享用 !!

这种方法对我有用:

  • closuresVS2015
  • 在VS2013中暂时打开解决scheme,通过右键单击解决scheme(我也做了重build,但我怀疑不需要)启用nuget包恢复
  • closuresVS2013
  • 在VS2015重新打开解决scheme

您现在也已经在VS2015中启用了nuget包恢复function。

Ivan Branet的解决scheme基本上解决了这个问题,但是可以分享更多细节。

就我而言,我在VS 2015中使用了Auto Package RestoreTFS 。 这是所有漂亮的默认东西。

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

你会认识到这一点,因为参考文件会有一个黄色的感叹号,关于没有解决。

因此, 删除软件包内的文件夹解决scheme删除软件包恢复阻止问题。 然后,您可以右键单击顶级解决scheme级别以获得恢复包的选项,现在它应该可以工作。

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

我不得不删除包文件夹closures和重新打开(VS2015)的解决scheme。 我没有迁移,我没有将包检入源代码pipe理。 我所能说的就是一些搞砸了的东西,这个问题已经解决了。

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

正如Mike已经提到的那样,VS2015中没有“启用NuGet包恢复”的选项。 您将不得不手动调用还原过程。 一个很好的方法 – 不用搞文件和目录 – 使用NuGet软件包pipe理控制台 :点击进入快速启动栏(通常在右上angular),进入console ,打开pipe理控制台,input命令:

 Update-Package –reinstall 

这将重新安装解决scheme中所有项目的所有包。 要指定一个项目,请input:

 Update-Package –reinstall -ProjectName MyProject 

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

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

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

closuresVS. 删除包文件夹下的所有内容 重新打开你的解决scheme。 右键点击你的项目,select“pipe理nuget包…”。 你会看到一个黄色的条出现在“Nuget Package Manager”窗口上,要求你恢复软件包。 这对我有效。

更简单的是,在你的解决scheme中添加一个.nuget文件夹,并且会出现'Restore Nuget Packages'(不知道nuget.exe是否需要存在才能使用)。