一劳永逸地修复 NuGet 包和引用

Posted

技术标签:

【中文标题】一劳永逸地修复 NuGet 包和引用【英文标题】:Fixing NuGet packages and references once and for all 【发布时间】:2016-03-20 02:34:45 【问题描述】:

Windows 8.1 Enterprise x64、Visual Studio 2015、MVC 5、EF 6、VS Online 使用 git

我是一个相对较新的 Visual Studio 开发人员(大约九个月),自从我开始使用引用和 NuGet 包以来,我一直非常困难。当我在周末关闭计算机时,我所有的参考资料都在周五正常工作。整个周末都没碰电脑,今天开机了,出现一大堆参考错误:

(总共有 6,262 个错误,但我显然无法截取整个内容。)

就像我说的那样,这种问题经常发生,令人难以置信的沮丧。我尝试过的事情:

确保实际引用了所有引发错误的引用 卸载/重新安装在 NuGet 中引发错误的包 彻底删除packages文件夹的内容,让NuGet恢复(全部重装,视图和以前一样的错误) 确保每个引用都设置为Copy Local 关闭解决方案,删除所有binobj 文件夹,重新启动计算机,清理,重建 确保所有必要的引用都在相关的web.config 中(在Views 内部或在根目录中) 检查 NuGet 选项以恢复丢失的包(没有出现,所有包都在我本地的 packages 文件夹中) 我确定我忘记在此处列出的其他内容

我对这些包和参考资料束手无策。每次都是不同的修复,这次我想不通。我是否错过了一些明显的修复,我忽略了一些东西?有没有办法在它工作时以某种方式进行备份,并在出现问题时恢复它?任何想法,无论是帮助解决当前问题还是解决潜在问题,都将不胜感激。

补充说明

问题不仅在于视图——控制器也会抛出错误。具体来说:

找不到类型或命名空间名称“Controller”(您是否缺少 using 指令或程序集引用?)

(字面意思是Controller,这不是我为了隐私或其他原因而改变的东西。)

尽管我对所有必要的命名空间都有using 语句,但这些仍然被抛出。 using 语句本身可以正常工作,但代码中会抛出错误。建议的自动修复是手动引用所有内容:例如,var sb = new StringBuilder(); 要我将行更改为var sb = new System.Text.StringBuilder();。测试该修复并不能纠正问题,同样的错误被抛出,但在 System 而不是 StringBuilder

要求的其他信息

我将 git 与 VS Team Services 一起使用(但使用 .gitignore 忽略包)。 我和另一个人在这方面工作,但另一个人在几周内根本没有碰过它(甚至没有从远程仓库中提取)。 .csproj 文件中的引用采用..\..\..\packages\ 格式(对于相对于.csproj 文件的位置正确)。 以 .NET 4.6 为目标(一直是,这不是新的) 所有参考文献均已解析,参考文献列表中没有感叹号。

【问题讨论】:

你使用版本控制吗?项目文件在工作和停止工作之间发生了什么变化?在这种情况下,更重要的问题是具有讽刺意味的警告,即未解决的引用。多人参与这个项目吗? .csproj XML 中指定的引用究竟如何?它必须..\packages 开头,之前不能再添加点(假设您的 .sln 是您的 .csproj 的上一级目录)。 @CodeCaster 我在 VS Online 中使用 git,但 .gitignore 忽略了包。我和另一个人在这方面工作,但另一个人在几周内根本没有碰过它(甚至没有从远程仓库中提取)。 .csproj 文件中的引用采用您指定的格式,是的。 ..\..\..\packages` (correct for the location relative to the .csproj` 文件)。 所有引用都解析了吗?您的目标是什么版本的 .Net Framework? @DavidG 是的,所有引用都解决了。面向 .NET 4.6。 VS 中是否启用了包还原? “在 Visual Studio 中构建期间自动检查丢失的包” 【参考方案1】:

新项目

您需要做一件事情才能使包与 git 一起正常工作:

创建存储库时,请确保添加为 Visual Studio 开发量身定制的 .gitignore。您可以在 Google 上搜索此类文件或从 here 获取。

这将确保您不会提交任何会在以后引起问题的事情。

这应该可以解决您将包签入代码存储库时通常发生的许多问题。您可以添加/删除包和升级包,还可以将存储库克隆到新机器,包将自动恢复。

现有项目

这对新项目很有用。如果您的项目已经非常混乱,那么很难修复它,因为 Visual Studio 将包版本保存在多个位置 - packages.config 和 app.config(以及相关的 web.config)。

选项 1 - 修复当前项目

您可以删除所有包(从所有项目中删除所有引用并删除包内容)。

确保软件包不再出现在任何文件中(例如 packages.config 或 app.config)。现在添加 .gitignore,然后开始添加包。

选项 2 - 创建一个新项目

如果不起作用,请启动一个新项目,添加 .gitignore,传输所有代码(仅您的代码)并安装包。

【讨论】:

“从现在开始,你的包不会有任何问题” - 这是错误的,当你唯一的操作是添加正确的条目时,可能会出现很多问题.gitignore。软件包版本也不保存在 app/web.config 中。 @CodeCaster 当然总会有问题。从OP的描述来看,我认为它会解决他的问题。 web.config 中还引用了包版本,如果它们未与其他文件中的版本同步,您会遇到麻烦。 在我看来,您将其发布为 “解决所有 NuGet 问题的权威霰弹枪方法”,但事实并非如此。另外,请告诉我 web.config 包版本的引用位置。【参考方案2】:

我不太熟悉 Git 在 VS 中的工作方式,但我记得最近有一次使用 TFS 将解决方案从源代码控制中解除绑定、修复所有包、清理和重新构建,然后再次绑定它解决了一堆有关 NuGet 引用的问题。

如果 Git 在 VS 中的工作方式不同,我深表歉意。

【讨论】:

以上是关于一劳永逸地修复 NuGet 包和引用的主要内容,如果未能解决你的问题,请参考以下文章

怎样修复usb驱动问题

如何本地调试nuget发布的dll

是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?

sqlite.interop.dll 怎么用nuget安装

FluentAssertions 的最新 nuget 包缺少 System.Xml 参考

Swift 中多个未解析的标识符