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

Posted

技术标签:

【中文标题】从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?【英文标题】:Retargeting solution from .Net 4.0 to 4.5 - how to retarget the NuGet packages? 【发布时间】:2012-08-13 23:21:02 【问题描述】:

我已将当前在 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 为目标的最佳做法是什么?

【问题讨论】:

***.com/questions/6876732/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

根据链接文档-reinstall 只会安装相同的版本,所以看不到使用-safe 的任何好处。我错过了什么吗?【参考方案3】:

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

update-package -reinstall <packagename> -ignoreDependencies

此标志将单独保留您的软件包依赖项,否则即使您最初想要重新安装的软件包仍保持其版本不变,它们也可能会被更新。

更多信息here。

【讨论】:

谢谢,确实省了很多麻烦。看着 Nuget 尝试重新安装 EnterpriseLibrary 倾向于在 30 多个项目中创建的 10 个左右的依赖项,正朝着一天的工作前进。这样可以缩短到几分钟。 正如其他人所说,很可能会破坏一切。 您可以通过在包管理器控制台下运行时稍微更改它来自动化整个解决方案:get-package | % update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies @KalebPederson 以我的经验,该命令适用于整个解决方案? @BjörnAliGöransson - 对不起,如果我不够清楚。答案提供了一种跨解决方案更新单个包的方法。我的脚本将遍历解决方案中的每个 NuGet 包,并在整个解决方案中重新定位它。答案对于单个项目来说是完美的,但如果你有很多需要重新定位的包,我提供的脚本可能会更好。【参考方案4】:

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

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

对于非常大的解决方案可能不切实际,但似乎是一个合理的折衷方案,仍然利用自动升级尽可能多的项目并隔离有问题的项目,而无需将每个 packages.config您的解决方案因失败而被删除。

【讨论】:

我遇到了同样的问题。 UpdatePackage -Reinstall 删除了几个项目的 package.config 和项目引用(特别是那些在其中生成了假程序集的项目)。我们通过撤消对搞砸项目的所有更改并运行来解决此问题:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies【参考方案5】:

NuGet 2.1 提供了一项功能,让这一切变得更加简单:只需从包管理器控制台执行 update-package -reinstall -ignoreDependencies

NuGet 2.0 不能很好地处理重新定位您的应用程序。为了更改包的目标框架,您必须卸载并重新安装包(记下您已安装的包,以便重新安装它们)。

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

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

【讨论】:

在 ASP.NET MVC 4 项目中使用 VS 2012 并在将 .NET Framework 从 4.0 重新定位到 4.5 之后,我在包管理器控制台中执行了 update-package -reinstall。所有的软件包都开始被卸载和更新,突然 Windows 8 重新启动,当它回来时它告诉“你的电脑遇到问题并重新启动。你想向微软发送信息吗?” :( 吓人...顺便说一句,这是我现在安装的 NuGet 版本:2.2.40116.9051 在这里打开了一个问题:nuget.codeplex.com/workitem/3049 -reinstall 选项从来没有为我工作过。它要么以错误的顺序删除,要么出现“无法删除 X,因为 Y 依赖于它”的错误,或者有时只是不读取包。上次我尝试它时,它删除了 EntityFramework,然后再也没有重新添加它。 update-package -reinstall 对我来说不是解决方案。它还更新了很多包,而不是把它们留在我们使用和测试过的版本上。例如,Ninject 升级到 v3,这是一个重大的版本更改。 甚至不要尝试更新页面-重新安装。当它在我的本地机器上运行时,这件事变得如此混乱,以至于我不得不阻止 NuGet 包管理器继续前进。由于某种原因,它删除了我的 jQuery 1.10 版本并用 1.4.4 替换它。只需手动完成,省去麻烦。 同意这个乱七八糟的东西,距离这篇文章还有两年时间。它发现了某些 nugets 的较低版本,并搞砸了很多参考资料。那是经过近两个小时的更新(在 2014 年初的高端工作站上)。解决方案中有 20 个项目。

以上是关于从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 网页的重定向和传值

安装了 .NET 4.5 的构建服务器能否成功地将针对 4.0 的项目部署到仅安装了 .NET 4.0 的服务器?

找不到F#SQL Server类型提供程序.NET SDK工具。 Windows 10

.NET 4.5 应用程序在具有 .NET 4.0 的系统上的特定功能兼容性

Apache 上的重定向(维护 POST 参数)

WiX 在具有 .NET 3.5 的机器上安装 .NET 4.5,但不在具有 .NET 4.0 的机器上