关于从.NET 4.0重定目标到4.5:从.NET 4.0重定目标到4.5-如何重定Nuget包的目标?

Retargeting solution from .Net 4.0 to 4.5 - how to retarget the NuGet packages?

我已经将当前在VS2010中面向.NET 4.0的解决方案迁移到了VS2012,现在我想将其重新定位到.NET 4.5。

我不确定的是裸体套餐。例如,我在VS2010中从EF4更新的EF5实际上是EF4.4,如您所见:

1
2
3
4
5
    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib
et40\EntityFramework.dll</HintPath>
    </Reference>

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

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

所以我的问题是:

将当前设置为.NET 4.0到.NET 4.5的所有nuget包重新定向的最佳实践是什么?


nuget 2.1提供了一个使这变得简单得多的特性:只需从包管理器控制台执行update-package -reinstall -ignoreDependencies

Nuget2.0不能很好地处理重新定位应用程序的问题。为了更改包的目标框架,必须卸载并重新安装包(注意已安装的包,以便可以重新安装每个包)。

必须卸载并重新安装程序包的原因是:

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


对于那些对update-package -reinstall 命令有问题的人,考虑使用-ignoreDependencies标志运行它,如下所示:

1
update-package -reinstall <packagename> -ignoreDependencies

此标志将使您的包依赖项保持不变,否则,即使最初要重新安装的包仍然保持其版本不变,它们也可能会得到更新。

更多信息在这里。


在尝试接受的答案失败后,我想建议使用风险较小的命令:

1
Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

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


在尝试在整个解决方案范围内重新安装软件包时,我遇到了依赖项错误(尽管使用了-ignoreDependencies标志),并且每个项目的所有packages.config文件都已被删除。在VS2013中,似乎packages.config不会被刷新回磁盘并重新添加,直到所有升级的依赖项/引用重新附加到项目。

在我的例子中,有效的方法是通过将-ProjectNameprojectname添加到update-package命令中,一次升级每个项目。在这种情况下,packages.config会随着每个项目的升级而更新。

对于非常大的解决方案来说可能不实用,但仍然尽可能多地利用自动升级的优势并隔离有问题的项目,而不在解决方案中删除每个packages.config,这似乎是一个合理的折衷。