从.Net 4.0到4.5的重定向解决方案 - 如何重新定位NuGet包?

Iva*_*tev 200 .net nuget .net-4.5 visual-studio-2012

我已经将目前针对VS2010中的.NET 4.0的解决方案迁移到VS2012,现在我想将其重新定位到.Net 4.5

我不确定的是NuGet包.例如,我在VS2010中从EF4更新的EF5实际上是EF 4.4,如下所示:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>
Run Code Online (Sandbox Code Playgroud)

我还可以在packages.config中看到以下项目:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

将目前设置为.NET 4.0的所有NuGet包重新定位到目标.NET 4.5的最佳做法是什么?

Jef*_*ley 264

NuGet 2.1提供的功能使这更简单:只需update-package -reinstall -ignoreDependencies从Package Manager控制台进行操作即可.

NuGet 2.0无法很好地重新定位您的应用程序.要更改软件包的目标框架,必须卸载并重新安装软件包(记下已安装的软件包,以便重新安装每个软件包).

必须卸载并重新安装软件包的原因是:

  • 安装软件包时,我们确定项目的目标框架
  • 然后我们将其与包内容进行匹配,找到相应的\ lib \文件夹(和\ content \文件夹)
  • 使用指向包的\ lib \文件夹的提示路径添加程序集引用,使用右侧子文件夹(例如\ lib \net40)
  • 内容文件从packages\content \文件夹复制,右侧子文件夹(例如\ content \net40)
  • 我们记录了用于在packages.config文件中安装软件包的targetFramework
  • 更改项目的目标框架后,提示路径仍指向net40
  • 卸载软件包时,我们检查packages.config中记录的targetFramework,以查看要从项目中删除的目标框架的库/内容
  • 当您重新安装软件包时,我们会检测您更新的目标框架并引用/复制正确的库/内容

  • 甚至不要尝试update-page -reinstall.当它在我的本地机器上运行时,我不得不停止NuGet包管理器进一步的事情.它删除了我的jQuery 1.10版本,并因某些原因将其替换为1.4.4.只需手动完成并省去麻烦. (13认同)
  • -reinstall选项从未对我有用过.它要么以错误的顺序删除,要么"无法删除X,因为Y依赖于它",或者有时只是没有读取包.上次我尝试过它,它删除了EntityFramework,然后再也没有重新添加它. (12认同)
  • update-package -reinstall对我来说不是一个解决方案.它还*更新了许多软件包,而不是将它们留在我们使用的版本上并进行了测试.例如,Ninject被提升到v3,这是一个破坏版本的变化. (4认同)
  • 同意这个烂摊子的东西,距离这篇帖子还有两年的时间.它找到了某些nugets的较低版本,并搞砸了许多引用.这是经过近两个小时的更新(从2014年初开始的高端工作站).解决方案中有20个项目. (2认同)

vpa*_*lmu 42

对于那些遇到update-package -reinstall <packagename>命令问题的人,可以考虑使用-ignoreDependenciesflag 运行它,如下所示:

update-package -reinstall <packagename> -ignoreDependencies
Run Code Online (Sandbox Code Playgroud)

此标志将单独保留您的包依赖项,否则它们可能会更新,即使您最初需要重新安装的程序包仍然保持其版本相同.

更多信息在这里.

  • 您可以通过在Package Manager控制台下运行时稍微更改它来为整个解决方案自动执行此操作:`get-package | %{update-package $ _.Id -reinstall -ProjectName $ _.ProjectName -ignoreDependencies}` (8认同)
  • @KalebPederson根据我的经验,该命令解决方案范围广泛吗? (2认同)

Bo *_*sen 22

在尝试接受的答案失败后,我想建议一个风险较低的命令:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息:http: //blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html