无法更新或安装包:已添加具有相同密钥的项目

Can't update or install package: An item with the same key has already been added

问题

在特定项目中,我无法更新或安装任何 NuGet 包。当我尝试使用 NuGet GUI 这样做时,它做了一些工作,然后什么也没说就停止了。当我尝试使用包管理器控制台执行此操作时,我得到以下输出:

PM> Update-Package –reinstall EntityFramework
Attempting to gather dependencies information for multiple packages with respect to project 'SmartCentre', targeting '.NETFramework,Version=v4.5.2'
Update-Package : An item with the same key has already been added.
At line:1 char:15
+ Update-Package <<<<  –reinstall EntityFramework
    + CategoryInfo          : NotSpecified: (:) [Update-Package], Exception
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.UpdatePackageCommand

环境

我试过的

原来 packages.config 文件有几个不同版本的副本:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- ... -->
  <package id="Microsoft.AspNet.Web.Optimization" version="1.0.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.2" targetFramework="net40" />
  <!-- ... -->
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
  <package id="Newtonsoft.Json" version="5.0.8" targetFramework="net40" />
  <!-- ... -->
</packages>

删除重复项后,问题就停止了:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- ... -->
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.2" targetFramework="net40" />
  <!-- ... -->
  <package id="Newtonsoft.Json" version="5.0.8" targetFramework="net40" />
  <!-- ... -->
</packages>

就我而言,我有不同的 packages.config 文件(一个在 pcl 中,一个在 droid 中,一个在 ios 中),具有不同的包版本。 在我的包文件夹 ( Projects\MyProjName\packages ) 中,我有这种情况:


我只删除了旧版本的重复项,之后我用正确的版本更新 package.config 文件中的数据 例如:

 <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net40" />

成为

<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net40" />

现在您可以重新打开项目,一切正常。

我什么都试过了,然后;

  1. 确保框架是最新的。 (对于我正在升级的 MVC 包)
  2. 已卸载 NuGet 并重新安装。

可能值得一试。不会花太长时间。

我以某种方式向我的 csproj 文件添加了两个不同版本的导入引用。我手动编辑它以删除额外的参考。

发件人:

<Import Project="..\packages\Xamarin.Forms.2.5.0.121934\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.5.0.121934\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" />

收件人:

<Import Project="..\packages\Xamarin.Forms.3.1.0.583944\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
<Import Project="..\packages\Xamarin.Forms.v\build\netstandard2.0\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.3.1.0.583944\build\netstandard2.0\Xamarin.Forms.targets')" />

一切顺利。

在我的情况下,我们的存储库中签入了一个错误的 nuget.config 文件。它的设置指向两个不同的 NuGet 存储库,这两个存储库都包含相同的包。我们使用的是 NuGet.exe 3.5。删除 nuget.config 文件为我们解决了这个问题。

我这边遇到了同样的问题。卸载软件包后安装软件包解决了问题。

如果有人在使用 net core 并遇到此错误,请使用命令提示符获取详细的错误消息。

请运行dotnet restore查找冲突的版本。

以上命令需要运行形成pjt文件所在的文件夹

例如:

 Unable to satisfy conflicting requests for '************': (>= 1.0.1)

 (via package/************ 1.0.22), ************ (>= 1.0.1)

 (via project/************ 1.0.0) Framework: 

 (.NETStandard,Version=v2.0)C:\Users\************\Source\************API.csproj]

就我而言,我在自定义 NuGet 包中 packaged multiple assemblies 并提高了主库的版本,但忘记更新辅助程序集。

My.MainPackage.dll v 1.6 <-- Bumped the version here
My.PackageDependency v 1.5 <-- Forgotten to bump this version

推送这个错误的包后,每当我尝试 Update-Package 使用以前版本的任何项目时,我都会收到错误消息

An item with the same key has already been added

因为这个包的前一个版本和下一个版本都包含旧版本的辅助程序集。

解决方案是简单地重建损坏的包,再次碰撞两个程序集版本。

FWIW 我试图用这个坏包升级的任何下游项目都处于半生不熟的状态,需要手动编辑才能恢复到一致的版本。

这个错误消息真的非常模糊,可以代表任何意思:(

我可以为大型项目推荐这种方法:

  • 从您的解决方案中删除所有项目
  • 一一阅读直到出现错误
  • 检查您上次添加的项目的.csproj
    • 从 .csproj 中删除大部分
    • 如果错误仍然存​​在请尝试
    • 重复直到您可以缩小导致问题的部分(阅读之前删除的部分通常是个好主意)
    • 继续,直到找到看起来重复的内容

对我来说,我的 .csproj 中有以下内容:

  <RuntimeIdentifier>win</RuntimeIdentifier>
  /* Some more stuff */
  <RuntimeIdentifiers>win;linux</RuntimeIdentifiers>

删除 <RuntimeIdentifier>win</RuntimeIdentifier> 解决了问题。

错误是重复的 proj/nuget 包。那么你如何找到没有 removing/re-installing 任何东西的副本?

我 运行 dotnet restore 收到了一大堆错误信息。最后得到了这个:

C:\...\NuGet.targets(128,5): 
 error : An item with the same key has already been added.
 Key: (MyLib, 1.0.2) [C:\SomeApp.csproj]

MyLib 是重复的。追踪它的所有引用。 SomeApp 没有直接引用它,而是通过另一个包引用间接引用它。现在看起来很明显,但我花了很长时间才读到这一行。希望这对某人有所帮助。

就我而言,甚至 dotnet restore 也没有透露任何信息。 然后我 dotnet build .sln 使用 VS 命令提示符,它揭示了实际错误以及罪魁祸首库和冲突版本。

我在使用 NuGet Package Explorer 验证新的 DotnetTool 时遇到了这个错误,原因是我的工具引用了来自 EXE(而不是 DLL)的代码,因此它以两个不同的“.deps.json" 文件。所以最好避免引用 EXE 文件。