关于c#:如何在Visual Studio中启用NuGet包还原?

How do I enable NuGet Package Restore in Visual Studio?

Stack上也有类似的帖子,但对我的问题没有帮助,可能是因为我正在使用Visual Studio 2015。

如何在VS2015中显示"启用nuget包还原"选项?

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

enter image description here

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


花费了太长时间,但我终于找到了将msbuild集成解决方案迁移到自动包还原的文档,并且我能够使用这里描述的方法解决这个问题。

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

    解决方案文件(.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.exe和nuget.targets文件。
  • 离开nuget.config。
  • 手动清除对nuget目标的任何引用的每个项目文件。上面提到的PowerShell脚本所造成的损害似乎大于好处。
  • 创建新项目时:

  • 在Visual Studio 2015解决方案中,创建名为.nuget的解决方案目录。
  • 创建解决方案目录的实际目录(该.sln文件所在的目录)并调用它.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管理控制台是一种不错的方法,不需要处理文件和目录:点击"快速启动"字段(通常在右上角),输入console,打开管理控制台,然后输入命令:

    1
    Update-Package –reinstall

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

    1
    Update-Package –reinstall -ProjectName MyProject

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


    如果您有任何问题或缺少任何包,您可以在项目中右键单击并选择"管理Nuget包以获得解决方案…"。点击此按钮后,屏幕将打开,您会看到一个菜单栏,上面写着"恢复":Restore

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


    将带有nuget包的项目从vx20xx升级到vs2015时,nuget包可能有问题。

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

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

    我解决了写一个小程序来做msbuild集成包还原和自动包还原的问题。

    您可以在此处下载该工具的可执行文件。

    请告诉我结果:—)!

    enter image description here

    参考代码:

    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,默认情况下它不在那里。我觉得有点奇怪。

  • 工具-Nuget包管理器-包管理器设置
  • 单击对话框左侧导航栏上的"软件包源"。
  • 使用加号(+)添加nuget url:https://api.nuget.org/v3/index.json

  • 也可能是在尝试安装程序包时运行该程序的结果。当内置的IIS在后台运行时,如果您尝试单击它,它将灰显。


    如果其他人在Visual Studio 2017中发现此问题,请确保项目是由.sln文件而不是文件夹打开的,因为如果项目是由文件夹打开的,Visual Studio将不会获取设置。如果您使用的是Visual Studio Online Services for Git,则默认情况下会发生这种情况。


    我用的是msbuild /t:restore

    资信来源:

    我的问题是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 and dotnet restore both use this command
    for applicable projects.


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

    您可以从运行控制台

    Tools > NuGet Package Manager > Package Manager Console


    帮助我通过工具>>>nuget package manager>>常规然后勾选选项允许nuget下载缺少的包,并在Visual Studio中生成期间自动检查缺少的包。

    enter image description here


    我不得不移除Packages文件夹关闭并重新打开(VS2015)解决方案。我没有迁移,也没有将包签入源代码管理。我能说的就是有些事情搞砸了,这件事解决了。


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