一劳永逸地修复 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
关闭解决方案,删除所有bin
和obj
文件夹,重新启动计算机,清理,重建
确保所有必要的引用都在相关的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 包和引用的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?