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


205

我已经将当前在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的所有NuGet包重新目标为.NET 4.5的最佳实践是什么?


Answers:


266

NuGet 2.1提供了使它变得更加简单的功能:只需update-package -reinstall -ignoreDependencies从Package Manager Console中进行操作即可。

NuGet 2.0不能很好地重新定位应用程序。为了更改软件包的目标框架,必须卸载并重新安装软件包(注意已安装的软件包,以便可以重新安装每个软件包)。

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

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

将VS 2012与ASP.NET MVC 4项目结合使用,并将.NET Framework从4.0重新定位到4.5之后,我update-package -reinstall在程序包管理器控制台中执行。所有软件包开始被卸载和更新,突然间Windows 8重新启动,当它恢复时,它告诉您“您的PC出现问题并重新启动。您要向Microsoft发送信息吗?” :(吓人...顺便说一下,这是我现在安装的NuGet版本:2.2.40116.9051在这里打开了一个问题:nuget.codeplex.com/workitem/3049
Leniel Maccaferri

12
-reinstall选项从未对我有用。它要么以错误的顺序删除并且出现“无法删除X,因为Y依赖于它”的错误,或者有时只是不读取程序包。上次尝试时,它删除了EntityFramework,然后再也没有添加它。
CodingWithSpike 2013年

4
update-package -reinstall对我来说不是解决方案。它还更新了许多软件包,而不是将它们保留在我们使用并经过测试的版本上。例如,Ninject已升级到v3,这是一个重大的版本更改。
史蒂夫·欧文

13
甚至不要尝试使用update-page -reinstall。当它在我的本地计算机上运行时,它变得一团糟,以至于我不得不阻止NuGet软件包管理器继续前进。它出于某种原因删除了我的jQuery 1.10版本,并用1.4.4替换了它。只需手动执行,即可避免麻烦。
贾斯汀·迈克尔斯(JustinMichaels)2013年

2
同意这一点,距离这篇文章还有两年的时间。它找到了某些nuget的较低版本,并且搞砸了很多参考文献。那是经过将近两个小时的更新(从2014年初开始在高端工作站上进行的)。解决方案中有20个项目。
2014年

42

对于那些对update-package -reinstall <packagename>命令有疑问的人,请考虑使用-ignoreDependenciesflag 运行它,如下所示:

update-package -reinstall <packagename> -ignoreDependencies

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

更多信息在这里


谢谢,这确实节省了很多麻烦。看着Nuget尝试重新安装EnterpriseLibrary倾向于在30多个项目中创建的10个左右的依赖项,而这项工作正朝着一天的工作迈进。这将其减少到几分钟。
David Keaveny 2013年

正如其他人所提到的,很可能破坏一切。
格莱诺2015年

9
您可以通过在Package Manager控制台下运行时对其稍作更改来使整个解决方案自动化:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson,

2
@KalebPederson以我的经验,该命令适用于各种解决方案?

1
@BjörnAliGöransson-对不起,如果我不够清楚。答案提供了一种在解决方案中更新单个软件包的方法。我的脚本将遍历解决方案中的每个NuGet包,然后在解决方案中重新定位它。答案对于单个项目是完美的,但是如果您有很多需要重新定向的包,我提供的脚本可能会更好。
Kaleb Pederson


4

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

在我的情况什么工作是通过将每个项目都有一个-AT-A-时间升级-ProjectName 项目名update-package命令。在这种情况下,随着每个项目的升级,packages.config也会更新。

对于大型解决方案而言可能不切实际,但似乎仍是一个合理的折衷方案,即仍要对尽可能多的项目利用自动升级,并隔离有问题的项目,而不会因失败而删除解决方案中的每个package.config


3
我遇到了同样的问题。UpdatePackage -Reinstall删除了一些项目(特别是其中生成了假程序集的项目)的package.config和项目引用。我们通过撤消对拧紧的项目的所有更改并运行来解决此问题:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

使用Visual Studio for Mac 2019,右键单击Packages文件夹在菜单中显示``重新定位''选项。这解决了项目中所有需要重新定向的软件包的重新定向问题。看来Mac上的Visual Studio(在我的身上至少)的“工具”菜单下没有NuGet软件包管理器,因此我无法启动软件包管理器控制台。

包右键单击菜单下的重定向目标菜单选项

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.