首页 文章

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

提问于
浏览
239

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

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

我选择了File> New Project并创建了一个 empty ASP.NET Web Application . 我正在寻找这个菜单选项 .

enter image description here

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

21 回答

  • 0

    对于 .NET Core projects ,在 NuGet Package Manager Console 中运行 dotnet restoredotnet build 命令(自动运行还原)

    您可以从中运行控制台

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

  • 56

    使用此命令还原所有包

    dotnet restore
    
  • 3

    更简单的是,在您的解决方案中添加一个.nuget文件夹,然后会出现'Restore Nuget Packages'(不确定nuget.exe是否需要存在才能正常工作) .

  • 4

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

    • 从解决方案中删除 '.nuget' 解决方案目录

    • .csproj.vbproj 文件中删除对 nuget.targets 的所有引用 . 虽然没有得到官方支持,但如果您有很多需要清理的项目,该文档会链接到PowerShell script . 我手动编辑了我的手册,所以我不能就我的经验给出任何反馈 .

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

    Solution File (.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
    

    Project File (.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>
    
  • 230

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

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

    When upgrading:

    • 不要删除.nuget目录 .

    • 删除nuget.exe和nuget.targets文件 .

    • 离开nuget.config .

    • 手动清除对NuGet目标的任何引用的每个项目文件 . 提到的Powershell脚本似乎造成的伤害大于好处 .

    When creating a new project:

    • 在Visual Studio 2015解决方案中,创建名为.nuget的解决方案目录 .

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

    • 在名为nuget.config的.nuget目录中创建一个文件 .

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

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

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

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

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

  • 11

    您可以选择从“packages”文件夹中删除所有文件夹,然后选择“管理解决方案的NuGet包...” . 在这种情况下,NuGet Packages Windows上会出现“Restore”按钮 .

  • 10

    如果您有任何问题或缺少任何软件包,只需在项目中右键单击并选择“ Manage NuGet Packages for Solution... ". After clicking on this a screen will open where you see a menu bar saying " Restore”:
    Restore

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

  • 1

    正如迈克已经提到的,VS2015中没有选项'Enable NuGet Package Restore' . 您必须手动调用还原过程 . 一个不错的方法 - 没有弄乱文件和目录 - 使用 NuGet Package Management Console :点击'Quick start'字段(通常在右上角),输入 console ,打开管理控制台,然后输入命令:

    Update-Package –reinstall
    

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

    Update-Package –reinstall -ProjectName MyProject
    

    当然,仅当 Restore 按钮(有时由VS2015提供)不可用时才需要这样做 . 这里列出并解释了更多有用的更新命令:https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages

  • 0

    使用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";
            }
    
        }
    }
    
  • 0

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

  • 30

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

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

  • 0

    这种方法对我有用:

    • 关闭VS2015

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

    • 关闭VS2013

    • 在VS2015中重新打开解决方案

    您现在已经在VS2015中启用了nuget包还原 .

  • 4

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

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

    • 右键单击解决方案文件,然后在Windows资源管理器中打开 .

    • NuGet.Config, NuGet.exe, NuGet.targets 复制 .nuget 文件夹(下载link或只是从其他项目复制并更换)

    • 尝试重建解决方案 .

    请享用 !!

  • 4

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

    在我的情况下,我在 VS 2015 使用 Auto Package restoreTFS . 这都是非常默认的东西 .

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

    你会认识到这一点,因为引用会有一个关于无法解析的黄色感叹号 .

    因此, solutionsolution 删除了包恢复阻止问题 . 然后你可以 right click at the top solution level 获得 restore packages 的选项,现在它应该可以工作 .

  • 6

    关闭VS.删除包文件夹下的所有内容重新打开您的解决方案 . 右键单击您的项目,选择“Manage nuget packages ...” . 您将看到“Nuget Package Manager”窗口顶部出现黄色条,要求您恢复包 . 这对我有用 .

  • -4

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

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

  • 5

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

  • 2

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

  • 0

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

  • 3

    我用 msbuild /t:restore .

    我的问题出在MSBuild所以我跟着 @Vinney Kelly 的链接:Migrating MSBuild-Integrated solutions to Automatic Package Restore

    和...

    这有点像一个CHARM =]

    MSBuild:使用msbuild / t:restore命令恢复项目文件中列出的软件包(仅限PackageReference) . 仅在Nu Studio 4.x和MSBuild 15.1中可用,它们包含在Visual Studio 2017中.nuget restore和dotnet restore都将此命令用于适用的项目 .

  • 0

    帮助我完成了 Tools >>> Nuget Package Manager >>> General 然后勾选了选项 Allow Nuget to download missing packageAutomatically check for missing packages during build in visual studio .

    enter image description here

相关问题