首页 文章

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

提问于
浏览
190

我已经将目前针对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>

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

<?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包的最佳做法是什么?

4 回答

  • 247

    NuGet 2.1 提供了一个使这更简单的功能:只需从包管理器控制台执行 update-package -reinstall -ignoreDependencies .

    NuGet 2.0 doesn 't handle re-targeting your applications very well. In order to change your packages'目标框架,您必须卸载并重新安装软件包(记下您已安装的软件包,以便可以重新安装它们) .

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

    • 安装软件包时,我们确定项目的目标框架

    • 然后我们将其与包内容进行匹配,找到相应的\ lib \文件夹(和\ content \文件夹)

    • 程序集引用添加了提示路径,指向程序包的\ lib \文件夹,右侧子文件夹(例如\ lib \ net40)

    • 内容文件从packages \ content \文件夹复制,右侧子文件夹(例如\ content \ net40)

    • 我们在packages.config文件中记录用于安装包的targetFramework

    • 更改项目的目标框架后,提示路径仍指向net40

    • 卸载软件包时,我们检查packages.config中记录的targetFramework,以查看要从项目中删除的目标框架的lib / content

    • 重新安装软件包时,我们会检测您更新的目标框架并引用/复制正确的库/内容

  • 37

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

    update-package -reinstall <packagename> -ignoreDependencies
    

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

    更多信息here .

  • 3

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

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

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

  • 19

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

    在我的例子中,通过将 -ProjectName projectname添加到 update-package 命令,可以一次一个地升级每个项目 . 在这种情况下,每个项目升级时都会更新packages.config .

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

相关问题