c# - that - 还原nuget包




如何在Visual Studio中启用NuGet程序包还原? (15)

堆栈上有一个 类似的帖子 ,但可能因为我使用的是Visual Studio 2015而无法解决我的问题。

如何获得“启用NuGet软件包还原”选项以出现在VS2015中?

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

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


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

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


Microsoft已在VS2015中删除了对“启用NuGet软件包还原”的支持,您需要进行一些手动更改才能迁移旧解决方案或将功能添加到新解决方案中。 NuGet软件包还原中 很好地描述了此新功能。

这里也有针对现有项目的迁移指南(如前所述): NuGet迁移指南

升级时:

  1. 不要删除.nuget目录。
  2. 删除nuget.exe和nuget.targets文件。
  3. 离开nuget.config。
  4. 手动清除对NuGet目标的任何引用的每个项目文件。 提到的Powershell脚本造成的损害似乎大于弊。

创建新项目时:

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

  4. 将“ nuget.config”添加到步骤2中创建的解决方案目录中。

  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>

通过此配置文件,您可以将所有软件包合并到一个位置,因此文件系统上不会浮动同一软件包的20个不同副本。 相对路径将根据您的解决方案目录体系结构而变化,但它应指向所有解决方案公用的目录。

完成第5步后,您需要重新启动VisualStudio。Nuget将无法识别所做的更改,除非您这样做。

最后,您可能必须使用“用于解决方案的Nuget软件包管理器”来卸载然后重新安装软件包。 我不知道这是我运行的Powershell脚本的副作用,还是只是使NuGet重新投入使用的一种方法。 一旦完成所有这些步骤,当我从TFVC中检出项目时,我复杂的构建体系结构就可以完美地删除新软件包。


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


使用此命令还原所有软件包

dotnet restore

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

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

  • 右键单击解决方案文件,然后在Windows资源管理器中打开。
  • 使用 NuGet.Config,NuGet.exe,NuGet.targets 复制 .nu​​get 文件夹(下载 link 或直接从其他项目复制并替换)
  • 尝试重建解决方案。

请享用 !!


如果您有任何问题或缺少任何软件包,只需在项目中单击鼠标右键,然后选择“ 为解决方案管理NuGet软件包... ”。 单击此按钮后,将打开一个屏幕,您会在其中看到一个菜单栏,显示“还原”:

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


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

您可以从以下位置运行控制台

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


将带有nuget软件包的项目从Vx20XX升级到VS2015时,您可能会遇到nuget软件包的问题。

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

更新2016年2月6日:我有一个信息链接,但是它不再起作用。 我怀疑最近的路径已经解决了这个问题?

我解决了编写一个执行 MSBuild集成程序包还原与自动程序包还原 的小程序的问题

您可以在 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";
        }

    }
}


我用了 msbuild /t:restore

信用和来源:

我的问题与MSBuild有关,所以我关注了 @Vinney Kelly 的链接:将与 MSBuild集成的解决方案迁移到自动软件包还原

和...

像LIKE A CHARM =]

MSBuild :使用 msbuild /t:restore 命令,该命令将还原项目文件中列出的软件包(仅 PackageReference )。 仅在 Visual Studio 2017 附带的NuGet 4.x +和MSBuild 15.1+中可用。 nuget restoredotnet restore 均对适用项目使用此命令。


正如Mike所提到的,VS2015中没有选项“ Enable NuGet Package Restore”。 您必须手动调用还原过程。 使用 NuGet软件包管理控制台的 一种好方法-不会弄乱文件和目录-单击“快速入门”字段(通常在右上角),输入 console ,打开管理控制台,然后输入命令:

Update-Package reinstall

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

Update-Package reinstall -ProjectName MyProject

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


花费了太长时间,但最终我找到了有关将 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>

这种方法对我有用:

  • 关闭VS2015
  • 暂时在VS2013中打开解决方案,并通过右键单击解决方案来启用 nuget软件包还原 (我也进行过重建,但我怀疑 不需要这样做 )。
  • 关闭VS2013
  • 重新打开VS2015中的解决方案

现在,您还已在VS2015中启用了 nuget软件包还原


通过 工具 >>> Nuget软件包管理器 >>> 常规 帮助我,然后勾选选项 允许Nuget下载丢失的软件包, 在Visual Studio中构建期间自动检查丢失的软件包


Ivan Branets 的解决方案本质上是为我解决此问题的方法,但是可以共享更多细节。

就我而言,我在 VS 2015中 使用 Auto Package Restore TFS 。 这些都是默认的东西。

问题是,当另一位开发人员尝试从TFS获取解决方案时,某些软件包没有完全还原。 (为什么,我还不太确定。)但是packages文件夹包含一个供参考和NuGet包使用的文件夹,但是并没有得到扩展(比如缺少一个包含.dll的lib文件夹。)在那里,但并不是很正确的概念阻止了软件包的还原。

您会认识到这一点,因为该引用将带有一个黄色的感叹号,表示该符号未被解析。

因此, 删除软件包 文件夹 解决方案 消除了软件包还原阻止的问题。 然后,您可以 在最高解决方案级别 单击鼠标右键, 以获取 还原软件包 的选项,现在它应该可以工作了。







nuget-package-restore