【问题标题】:Can't update or install package: An item with the same key has already been added无法更新或安装包:已添加具有相同密钥的项目
【发布时间】:2022-03-14 02:32:11
【问题描述】:

问题

在特定项目中,我无法更新或安装任何 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

环境

  • Visual Studio 专业版 2015 更新 1
  • NuGet 3.3.0.167

我尝试过的

  • 删除packages 文件夹
  • 重新启动 Visual Studio
  • 重新启动计算机

【问题讨论】:

    标签: nuget


    【解决方案1】:

    原来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>
    

    【讨论】:

    • 这解决了我的问题。我从另一个开发人员那里获得的项目中的两个不同版本的 NuGet 包。检查实际使用的版本,然后使用记事本删除未使用的版本。在VS中重新加载,一切正常。谢谢!
    • 非常感谢它也解决了我的问题。很遗憾看到微软在报告问题时无法做得比这更好。如果发现存在重复,即密钥已经存在。然后我不知道为什么他们很难告诉我们哪个键!他们的未来非常悲惨。开源万岁。
    【解决方案2】:

    如果有人在使用 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]
    

    【讨论】:

    • 这帮助我找到了问题。两个不同包引用的两个不同版本的 System.Memory。
    • 谢谢您,我差点忘了您可以手动进行 dotnet restore 并通过这种方式获取更多详细信息。
    【解决方案3】:

    错误是重复的 proj/nuget 包。那么如何在不删除/重新安装任何内容的情况下找到副本?

    我运行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 没有直接引用它,而是通过另一个包引用间接引用它。现在似乎很明显,但我花了很长时间才读到这一行。希望这对某人有所帮助。

    【讨论】:

      【解决方案4】:

      就我而言,我有不同的 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" />
      

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

      【讨论】:

      • 我的只有旧记录,不允许更新。所以按照你的做法,我只是在 DL 之后更改了版本。不知道为什么会这样,因为我没有两个。感谢您提供帮助的答案!
      【解决方案5】:

      这个错误信息真的非常模糊,可能意味着任何东西:(

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

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

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

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

      删除&lt;RuntimeIdentifier&gt;win&lt;/RuntimeIdentifier&gt; 解决了这个问题。

      【讨论】:

      • 正是这对我造成了问题
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        我什么都试过了,然后;

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

        这可能值得一试。不需要太长时间。

        【讨论】:

          【解决方案8】:

          我以某种方式向我的 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')" />
          

          一切都好。

          【讨论】:

            【解决方案9】:

            我这边也遇到了同样的问题。 Uninstall-package 后跟 Install-package 解决了这个问题。

            【讨论】:

              【解决方案10】:

              在我的例子中,我在自定义 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任何使用旧版本的项目时,都会收到错误提示

              已添加具有相同密钥的项目

              由于此软件包的上一版本和下一版本都包含旧版本的辅助程序集。

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

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

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  我在使用 NuGet 包资源管理器验证新的 DotnetTool 时遇到此错误,原因是我的工具引用了来自 EXE(而不是 DLL)的代码,因此它以两个不同的“.deps.json”结束文件。所以最好避免引用 EXE 文件。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-27
                    • 2014-08-17
                    • 2021-08-02
                    • 2011-03-01
                    • 2017-11-17
                    相关资源
                    最近更新 更多