How do I enable NuGet Package Restore in Visual Studio?
Stack上也有类似的帖子,但对我的问题没有帮助,可能是因为我正在使用Visual Studio 2015。
如何在VS2015中显示"启用nuget包还原"选项?
我选择了"文件>新建项目",并创建了一个空的ASP.NET Web应用程序。我在找这个菜单选项。
我应该提到,我已经在我的项目文件夹中查找了任何预先存在的nuget文件,但没有。
花费了太长时间,但我终于找到了将msbuild集成解决方案迁移到自动包还原的文档,并且我能够使用这里描述的方法解决这个问题。
手工编辑文件时,以下是您要查找的内容:
解决方案文件(.sln)
1 2 3 4 5 6 7 8 9 10 11 12 13 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") =".nuget",".nuget","{F4AEBB8B-A367-424E-8B14-F611C9667A85}" ProjectSection(SolutionItems) = preProject .nuget uGet.Config = .nuget uGet.Config .nuget uGet.exe = .nuget uGet.exe .nuget uGet.targets = .nuget uGet.targets EndProjectSection EndProject |
项目文件(.csproj/.vbproj)
1 2 3 4 5 6 7 8 9 10 11 | <Import Project="$(SolutionDir)\.nuget uGet.targets" Condition="Exists('$(SolutionDir)\.nuget uGet.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 uGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget uGet.targets'))" /> </Target> |
Microsoft已经放弃了对VS2015中"启用Nuget包还原"的支持,您需要进行一些手动更改,以迁移旧的解决方案或将该功能添加到新的解决方案中。新特性在nuget包恢复中描述得很好。
这里还有一个现有项目的迁移指南(如前所述):nuget迁移指南
升级时:
创建新项目时:
在.nuget目录中创建名为nuget.config的文件。
将"nuget.config"添加到步骤2中创建的解决方案目录中。
在nuget.config文件中放置以下文本:
此配置文件将允许您将所有包合并到一个位置,这样您的文件系统上就不会有同一包的20个不同副本。相对路径将根据您的解决方案目录体系结构而改变,但它应该指向所有解决方案共用的目录。
完成步骤5后,需要重新启动Visual Studio。除非你这样做,否则Nuget不会识别这些变化。
最后,您可能需要使用"nuget package manager for solutions"卸载并重新安装软件包。我不知道这是我运行的PowerShell脚本的副作用,还是仅仅是一种将Nuget重新启动的方法。一旦我完成了所有这些步骤,当我从tfvc中签出项目时,我复杂的构建体系结构完美地完成了新包的生成。
也可以从"packages"文件夹中删除所有文件夹,然后选择"Manage nuget packages for solution…"。在这种情况下,"还原"按钮出现在Nuget软件包窗口上。
正如Mike已经提到的,在VS2015中没有"启用nuget包恢复"选项。您必须手动调用恢复过程。使用nuget package管理控制台是一种不错的方法,不需要处理文件和目录:点击"快速启动"字段(通常在右上角),输入
1 | Update-Package –reinstall |
这将重新安装解决方案中所有项目的所有包。要指定单个项目,请输入:
1 | Update-Package –reinstall -ProjectName MyProject |
当然,只有当
如果您有任何问题或缺少任何包,您可以在项目中右键单击并选择"管理Nuget包以获得解决方案…"。点击此按钮后,屏幕将打开,您会看到一个菜单栏,上面写着"恢复":
单击它,所需的软件包将自动安装。
我相信这就是你要找的,这解决了我的问题。
将带有nuget包的项目从vx20xx升级到vs2015时,nuget包可能有问题。
错误消息示例:此项目引用此计算机上缺少的nuget包。启用nuget包还原以下载它们。
更新2016-02-06:我有一个信息链接,但它不再起作用。我怀疑最近的一条路解决了这个问题????
我解决了写一个小程序来做msbuild集成包还原和自动包还原的问题。
您可以在此处下载该工具的可执行文件。
请告诉我结果:—)!
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | <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 uGetPackages"; } 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 +" "; } } } |
查看Visual Studio中的引用并查看缺少哪些包。现在右键单击Visual中的解决方案,然后单击文件资源管理器中的打开文件夹。现在打开Packages文件夹并删除Missing Packages文件夹。打开Visual Studio并构建解决方案。将还原所有丢失的包。如果我帮忙,请把这个标记为答案。
我在尝试构建示例项目gplus quickstart csharp master时遇到了同样的问题。
我仔细查看了错误消息,找到了克服这个错误的解决方法,希望这能有所帮助。
- 右键单击解决方案文件并在Windows资源管理器中打开。
- 用nuget.config、nuget.exe、nuget.targets复制.nuget文件夹(下载链接或从其他项目复制并替换)
- 尝试重建解决方案。
享受!!
我认为对于ASP.NET 4项目,我们将转向自动还原,因此不需要这样做。对于较老的项目,我认为需要一些转换工作。
http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore
这种方法对我很有用:
- 关闭VS2015
- 在VS2013中临时打开该解决方案,并通过右键单击该解决方案来启用Nuget包还原(我还进行了重建,但我怀疑这不是必需的)。
- 关闭VS2013
- 在VS2015中重新打开解决方案
您现在也在VS2015中启用了Nuget包恢复。
伊凡·布兰茨的解决方案基本上就是为我解决了这个问题,但可以分享更多的细节。
在我的例子中,我在vs 2015中使用了auto-package restore和tfs。这都是相当默认的东西。
问题是,当另一个开发人员试图从TFS获得解决方案时,一些包没有完全恢复。(为什么,我还不太确定。)但是packages文件夹包含一个用于引用的文件夹和nuget包,但是它没有被扩展(比如说,缺少一个包含.dll的lib文件夹)。这一半在那里,但不完全正确的概念阻止了包被还原。
您将认识到这一点,因为引用将带有一个关于未解析的黄色感叹号。
因此,删除包中的文件夹的解决方案消除了包恢复阻塞问题。然后,您可以右键单击顶部的解决方案级别以获得恢复包的选项,现在它应该可以工作了。
关闭与删除"程序包"文件夹下的所有内容。重新打开解决方案。右键单击项目,选择"管理Nuget包…"。您将看到一个黄色条出现在"Nuget Package Manager"窗口的顶部,要求您恢复包。这对我很有效。
0
来自https://docs.microsoft.com/en-us/nuget/quickstart/restore
使用此命令还原所有包
2如果所有其他的都失败了(或者在那之前),您可能想检查一下nuget是否是一个包源。我安装了VS2017,默认情况下它不在那里。我觉得有点奇怪。
也可能是在尝试安装程序包时运行该程序的结果。当内置的IIS在后台运行时,如果您尝试单击它,它将灰显。
如果其他人在Visual Studio 2017中发现此问题,请确保项目是由.sln文件而不是文件夹打开的,因为如果项目是由文件夹打开的,Visual Studio将不会获取设置。如果您使用的是Visual Studio Online Services for Git,则默认情况下会发生这种情况。
我用的是
我的问题是msbuild所以我遵循了@vinney-kelly的链接:将msbuild集成解决方案迁移到自动包恢复
还有…
就像一个魅力=]
MSBuild: use the
msbuild /t:restore command, which restores packages
packages listed in the project file (PackageReference only). Available
only in NuGet 4.x+ and MSBuild 15.1+, which are included with Visual
Studio 2017.nuget restore anddotnet restore both use this command
for applicable projects.
对于.NET核心项目,在
您可以从运行控制台
Tools > NuGet Package Manager > Package Manager Console
帮助我通过工具>>>nuget package manager>>常规然后勾选选项允许nuget下载缺少的包,并在Visual Studio中生成期间自动检查缺少的包。
我不得不移除Packages文件夹关闭并重新打开(VS2015)解决方案。我没有迁移,也没有将包签入源代码管理。我能说的就是有些事情搞砸了,这件事解决了。
更简单的方法是,在解决方案中添加一个.nuget文件夹,然后会出现"restore nuget packages"(不确定nuget.exe是否需要存在才能正常工作)。