安装 nuget 包“已添加相同的密钥”。

Posted

技术标签:

【中文标题】安装 nuget 包“已添加相同的密钥”。【英文标题】:installing nuget package "same key has already been added." 【发布时间】:2014-08-17 06:23:02 【问题描述】:

我正在尝试安装 Microsoft.Bcl.Build 1.0.14

nuget 返回

Installing 'Microsoft.Bcl.Build 1.0.14'. Successfully installed 'Microsoft.Bcl.Build 1.0.14'. Adding 'Microsoft.Bcl.Build 1.0.14' to LeadTracker.Calendar. Uninstalling 'Microsoft.Bcl.Build 1.0.14'. Successfully uninstalled 'Microsoft.Bcl.Build 1.0.14'. Install failed. Rolling back... An item with the same key has already been added.

json.net 和其他包也会发生这种情况。

我可以添加 nancy 和 topshelf,但不能添加 json.net 和 bcl。

我在VS2012和2013都试过了。我也试过卸载nuget并重新安装。我还尝试将 nuget 添加到一个空的类库和一个空的控制台应用程序中。总是返回相同的错误。

json.net 和其他包也会发生这种情况。

我也试过没有包文件

任何最受赞赏的想法。

这里是命令和堆栈跟踪

PM> Install-Package Microsoft.Bcl.Build Installing 'Microsoft.Bcl.Build 1.0.14'. You are downloading Microsoft.Bcl.Build from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=329770. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device. Successfully installed 'Microsoft.Bcl.Build 1.0.14'. Adding 'Microsoft.Bcl.Build 1.0.14' to GoogleCalendarIntegration. Uninstalling 'Microsoft.Bcl.Build 1.0.14'. Successfully uninstalled 'Microsoft.Bcl.Build 1.0.14'. Install failed. Rolling back... Install-Package : An item with the same key has already been added. At line:1 char:1
+ Install-Package Microsoft.Bcl.Build
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Install-Package], ArgumentException
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPac     kageCommand   PM> $error[0].exception.stacktrace    at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)  at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)    at System.Collections.ObjectModel.KeyedCollection`2.AddKey(TKey key, TItem item)    at System.Collections.ObjectModel.KeyedCollection`2.InsertItem(Int32 index, TItem item)    at System.Collections.ObjectModel.Collection`1.Add(T item)    at NuGet.CollectionExtensions.AddRange[T](ICollection`1 collection, IEnumerable`1 items)    at NuGet.NetPortableProfileTable.BuildPortableProfileCollection()    at NuGet.NetPortableProfileTable.get_Profiles()    at NuGet.NetPortableProfileTable.GetProfile(String profileName)    at NuGet.NetPortableProfile.Parse(String profileValue, Boolean treatOptionalFrameworksAsSuppor tedFrameworks)    at NuGet.VersionUtility.IsPortableLibraryCompatible(FrameworkName projectFrameworkName, Framew orkName packageTargetFrameworkName)    at NuGet.VersionUtility.IsCompatible(FrameworkName projectFrameworkName, FrameworkName package TargetFrameworkName)    at NuGet.VersionUtility.<>c__DisplayClass8`1.<TryGetCompatibleItems>b__15(IGrouping`2 g)    at System.Linq.Enumerable.WhereListIterator`1.MoveNext()    at System.Linq.Buffer`1..ctor(IEnumerable`1 source)    at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)   at NuGet.VersionUtility.TryGetCompatibleItems[T](FrameworkName projectFramework, IEnumerable`1  items, IEnumerable`1& compatibleItems)    at NuGet.ProjectSystemExtensions.GetCompatibleItemsCore[T](IProjectSystem projectSystem, IEnum erable`1 items)    at NuGet.ProjectManager.ExtractPackageFilesToProject(IPackage package)    at NuGet.ProjectManager.AddPackageReferenceToProject(IPackage package) at NuGet.ProjectManager.Execute(PackageOperation operation)    at NuGet.ProjectManager.Execute(IPackage package, IPackageOperationResolver resolver)    at NuGet.ProjectManager.AddPackageReference(IPackage package, Boolean ignoreDependencies, Bool ean allowPrereleaseVersions)    at NuGet.VisualStudio.VsPackageManager.<>c__DisplayClass83.<AddPackageReference>b__85() at NuGet.VisualStudio.VsPackageManager.RunProjectAction(IProjectManager projectManager, Action  action)    at NuGet.VisualStudio.VsPackageManager.AddPackageReference(IProjectManager projectManager, IPa ckage package, Boolean ignoreDependencies, Boolean allowPrereleaseVersions)    at NuGet.VisualStudio.VsPackageManager.<>c__DisplayClass3.<InstallPackage>b__7() at NuGet.VisualStudio.VsPackageManager.RunSolutionAction(Action action)    at NuGet.VisualStudio.VsPackageManager.InstallPackage(IProjectManager projectManager, String p ackageId, SemanticVersion version, Boolean ignoreDependencies, Boolean allowPrereleaseVersions, B oolean skipAssemblyReferences, ILogger logger)    at NuGet.VisualStudio.VsPackageManager.InstallPackage(IProjectManager projectManager, String p ackageId, SemanticVersion version, Boolean ignoreDependencies, Boolean allowPrereleaseVersions, I Logger logger)  at NuGet.PowerShell.Commands.InstallPackageCommand.InstallPackage(IVsPackageManager packageMan ager)    at NuGet.PowerShell.Commands.InstallPackageCommand.ProcessRecordCore()    at NuGet.PowerShell.Commands.NuGetBaseCommand.ProcessRecord() PM>

【问题讨论】:

您是否尝试删除 package.config 文件中的条目? 是的,并且在没有包文件的情况下进行了尝试。我已经更新了问题。 尝试从包管理器控制台窗口安装 NuGet 包。然后,如果在安装失败后运行“$error[0].exception.stacktrace”,您应该能够看到错误的完整异常调用堆栈。这可能会给我们一个更好的线索来了解它失败的原因和位置。 谢谢,已将堆栈跟踪添加到问题中 错误报告给 NuGet github.com/NuGet/Home/issues/2464 【参考方案1】:

检查你的packages.config 里面,检查你试图安装的包。也许已经有一些参考资料,这样可以避免您安装新的参考资料。

如果您在那里找到参考,请从 packages.config 中删除参考并尝试再次安装该包。

我有时会在 packages.config 中发生一些旧的引用,即使从 Nuget 包管理器中删除包后仍然存在这些引用。

如果没有,您可以删除整个 packages.config,然后如果您可以选择让 Nuget 下载包,则在您构建解决方案时,将再次下载包。

希望对你有帮助

【讨论】:

呼。很高兴这解决了我的问题,我不必求助于所有人与@Hans 的回答有关的所有乐趣! +1 如果您手动编辑 packages.config,这很容易发生 - NuGet 将拒绝处理具有相同程序集重复条目的项目。 是的,我在 package.config 中有 2 个包具有相同的 ID,但版本号不同。所以我保留了最新版本,删除了旧版本,然后它就可以工作了。【参考方案2】:

您的堆栈跟踪告诉我们,失败的是 NuGet.NetPortableProfileTable.BuildPortableProfileCollection()。简而言之,它迭代了一组 PCL 参考程序集配置文件并多次遇到相同的配置文件。这是一个非常强烈的提示,表明您的 c:\program files (x86)\reference assemblies\microsoft\framework\.netportable 目录的内容已损坏。

修复损坏的方法有很多:

如果您有修改此目录的积极回忆,例如复制文件,请撤消您所做的操作。 最安全的方法是卸载 所有 Visual Studio 版本 >= VS2010。然后手动清理目录,删除仍然存在的任何杂散文件。然后重新安装 VS。 不太安全但速度更快的方法是重命名 c:\program files (x86)\reference assembly 目录并安装multi-targeting pack。我不能保证成功。 您可以尝试自己查找副本并将其删除。目录结构如下:
 Directory of C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile

05/14/2014  01:01 PM    <DIR>          Profile1
05/14/2014  01:01 PM    <DIR>          Profile102
05/14/2014  01:01 PM    <DIR>          Profile104
05/14/2014  01:01 PM    <DIR>          Profile131
05/14/2014  01:01 PM    <DIR>          Profile136
05/14/2014  01:01 PM    <DIR>          Profile14
05/14/2014  01:01 PM    <DIR>          Profile143
05/14/2014  01:01 PM    <DIR>          Profile147
05/14/2014  01:01 PM    <DIR>          Profile154
05/14/2014  01:01 PM    <DIR>          Profile158
05/14/2014  01:01 PM    <DIR>          Profile18
05/14/2014  01:01 PM    <DIR>          Profile19
05/14/2014  01:01 PM    <DIR>          Profile2
05/14/2014  01:01 PM    <DIR>          Profile225
05/14/2014  01:01 PM    <DIR>          Profile23
05/14/2014  01:01 PM    <DIR>          Profile24
05/14/2014  01:01 PM    <DIR>          Profile240
05/14/2014  01:01 PM    <DIR>          Profile255
05/14/2014  01:01 PM    <DIR>          Profile3
05/14/2014  01:01 PM    <DIR>          Profile328
05/14/2014  01:01 PM    <DIR>          Profile336
05/14/2014  01:01 PM    <DIR>          Profile344
05/14/2014  01:01 PM    <DIR>          Profile36
05/14/2014  01:01 PM    <DIR>          Profile37
05/14/2014  01:01 PM    <DIR>          Profile4
05/14/2014  01:01 PM    <DIR>          Profile41
05/14/2014  01:01 PM    <DIR>          Profile42
05/14/2014  01:01 PM    <DIR>          Profile46
05/14/2014  01:01 PM    <DIR>          Profile47
05/14/2014  01:01 PM    <DIR>          Profile5
05/14/2014  01:01 PM    <DIR>          Profile6
05/14/2014  01:01 PM    <DIR>          Profile88
05/14/2014  01:01 PM    <DIR>          Profile92
05/14/2014  01:01 PM    <DIR>          Profile95
05/14/2014  01:01 PM    <DIR>          Profile96

 Directory of C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile

05/14/2014  12:59 PM    <DIR>          .
05/14/2014  12:59 PM    <DIR>          ..
05/14/2014  01:01 PM    <DIR>          Profile111
05/14/2014  01:01 PM    <DIR>          Profile259
05/14/2014  01:01 PM    <DIR>          Profile49
05/14/2014  01:01 PM    <DIR>          Profile7
05/14/2014  01:01 PM    <DIR>          Profile78

 Directory of C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.6\Profile

05/14/2014  12:59 PM    <DIR>          .
05/14/2014  12:59 PM    <DIR>          ..
05/14/2014  01:01 PM    <DIR>          Profile151
05/14/2014  01:01 PM    <DIR>          Profile157
05/14/2014  01:01 PM    <DIR>          Profile31
05/14/2014  01:01 PM    <DIR>          Profile32
05/14/2014  01:01 PM    <DIR>          Profile44
05/14/2014  01:01 PM    <DIR>          Profile84

【讨论】:

【参考方案3】:

还有另一个路径会产生此错误。以下是如何重现它:

(1) 从 VS 项目(项目 1)创建一个 nuget 包。 (2)在引用项目1的项目2中,安装项目1的nuget包。 (3) 安装将失败,出现“same key”错误。

解决方案是在安装 nuget 包之前简单地删除对项目 1 的引用。

【讨论】:

【参考方案4】:

看起来 NuGet 正在您的计算机上找到重复的可移植类库 (PCL) 配置文件。遗憾的是,密钥没有记录在异常调用堆栈中,这会使事情变得简单。

您可以尝试 Jon Skeet 的 PclPal 程序,该程序可以列出 PCL 配置文件并查看是否有任何重复内容。

我还有另一个 MonoPcl program 做类似的事情。它指的是 Mono,但适用于 Windows。它使用 NuGet 源代码,因此它会遇到与您在 Visual Studio 中看到的相同的问题。但是,您应该能够modify the code 捕获异常或添加一些额外的日志以查看导致问题的重复 PCL 配置文件是什么。

【讨论】:

感谢您的 MonoPcl 程序对我的帮助!!【参考方案5】:

进入您的packages 目录并删除您不再需要的所有版本的软件包。

然后尝试安装正确的版本。我认为它正在查看该目录中的所有文件夹并尝试将它们添加到某种字典/哈希集并找到两个。

【讨论】:

【参考方案6】:

只需更新工具中的 Nuget 包管理器 -- 扩展和更新 -- 更新 --visual studio 库 --update Nuget 包管理器

【讨论】:

感谢您的简单回答! 这对我也有用。我卸载了 nuget(因为没有更新)并重新安装它。这是唯一对我有用的东西。【参考方案7】:

我刚刚遇到了同样的问题,但是安装 NuGet 包管理器的最新更新解决了这个问题。

【讨论】:

【参考方案8】:

我在安装 Autofac 和 Autofac MVC 5 Integration 时遇到了同样的问题。 我在解决方案中使用 Manage Nuget Packages 解决了这个问题,我取消选中两个包(卸载),重新启动 Visual Studio 并成功重新安装包。

【讨论】:

【参考方案9】:

就我而言,我从包管理器控制台运行dotnet restore 以获取重复的密钥

PM> dotnet restore
  Determining projects to restore...
C:\Program Files\dotnet\sdk\3.1.300\NuGet.targets(128,5): error : An item with the same key has already been added. Key: (XXXX.XXX.XX, 1.0.0.0-preview1) [C:\code\MySolution.sln]

【讨论】:

【参考方案10】:

我在用 c#构建一个项目时遇到了同样的问题。

System.ArgumentException: An item with the same key has already been added.
     at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
     at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
     at System.IO.Packaging.ZipPackage.ContentTypeHelper.ProcessDefaultTagAttributes(XmlTextReader reader)
     at System.IO.Packaging.ZipPackage.ContentTypeHelper.ParseContentTypesFile(ZipFileInfoCollection zipFiles)
     at System.IO.Packaging.ZipPackage.ContentTypeHelper..ctor(ZipArchive zipArchive, IgnoredItemHelper ignoredItemHelper)
     at System.IO.Packaging.ZipPackage..ctor(Stream s, FileMode mode, FileAccess access, Boolean streaming)
     at System.IO.Packaging.Package.Open(Stream stream, FileMode packageMode, FileAccess packageAccess, Boolean streaming)
     at System.IO.Packaging.Package.Open(Stream stream)
     at NuGet.PackageHelper.GetManifestStream(Stream packageStream)
     at NuGet.OptimizedZipPackage.EnsureManifest()
     at NuGet.OptimizedZipPackage..ctor(String fullPackagePath)
     at NuGet.CommandLine.PackCommand.PrintVerbose(String outputPath)
     at NuGet.CommandLine.PackCommand.BuildPackage(PackageBuilder builder, String outputPath)
     at NuGet.CommandLine.PackCommand.BuildFromNuspec(String path)
     at NuGet.CommandLine.PackCommand.BuildPackage(String path)
     at NuGet.CommandLine.PackCommand.ExecuteCommand()
     at NuGet.CommandLine.Command.ExecuteCommandAsync()
     at NuGet.CommandLine.Command.Execute()
     at NuGet.CommandLine.Program.MainCore(String workingDirectory, String[] args)

发现 bin\Debug 文件夹中存在多个 Nuget .spec 文件。

【讨论】:

【参考方案11】:

这种情况经常发生在 .Net Core 和 .Net 标准可移植类库空间中。即使我没有追查问题的真正根源,当我使用具有许多其他外部依赖项(具有与之关联的术语)的包直接修改 project.json 依赖项部分时,它似乎最常发生。

如果您可以确定负责的库并删除所有依赖项并使用适当的 nuget 包管理工具添加包。必须完全删除并重新创建 CLI 并不少见!

【讨论】:

【参考方案12】:

我遇到了类似的问题。当我使用记事本在项目的 .csproj 文件中删除具有指定包的重复 PackageReference 元素时,该问题已得到纠正。

【讨论】:

以上是关于安装 nuget 包“已添加相同的密钥”。的主要内容,如果未能解决你的问题,请参考以下文章

如何列出所有已安装的 NuGet 包?

安装 Nuget 包错误“路径不是合法形式”

c#离线安装NuGet包

c#离线安装NuGet包

c#离线安装NuGet包

如何在本地安装 NuGet 包 .nupkg 文件?