有没有一种聪明的方法来处理 NuGet 中的包依赖关系?
Posted
技术标签:
【中文标题】有没有一种聪明的方法来处理 NuGet 中的包依赖关系?【英文标题】:Is there a smart way to deal with package dependencies in NuGet? 【发布时间】:2015-12-19 02:01:07 【问题描述】:我们正在开发一个工作中的 WPF 应用程序,它具有各种“常见”依赖项(Unity、Prism 等)。
添加新项目,然后为每个项目设置 NuGet 包依赖关系时一切正常,但在升级时,这真的很痛苦,因为这意味着我们必须遍历每个项目,删除旧引用,然后重新获取NuGet 的最新包。
例如,今天我的任务是将 Prism 从 5.0 升级到 6.0(无论如何都有重大更改),这意味着,除了修复所有命名空间冲突等,我必须通过每个项目,删除旧的引用,添加新的依赖并冲洗并重复。
我的问题是,有没有更聪明的方法来处理这个问题,或者这是标准方法?
非常感谢,
更新:
我最关心的是包管理器上没有显示的“主要”升级。版本 5.0 -> 6.0 升级将被视为主要升级,因此不会在 NuGet 包管理器中对其应用自动更新。
我不希望 NuGet 能够自动为我执行此操作,因为此类升级可能(并且经常这样做)包括重大更改,但我想知道是否有一种方法可以比删除来自每个项目的项目和 packages.config 的引用,然后使用 NuGet 重新添加它们。对于一个相对较大的项目,这非常耗时,我想知道是否有人有更好的方法来管理此类依赖项。
【问题讨论】:
我认为你还没有使用过 VS2015...你使用的是哪个版本的 Visual Studio? @DeblatonJean-Philippe 2013。我很想升级到 2015 但不幸的是目前不可行(企业许可等) @kha(更新后)我不确定我是否理解。我通过 NuGet 包管理器对 Entity Framework 从 v5.0.0 到 v6.1.3 进行了重大更新,是的,存在重大更改,因此我也必须修复这些更改。 app.config/web.config 文件中的引用会自动更新,我所要做的就是在 using 语句中更改一些命名空间问题。 @djm61 不幸的是,至少对于 PRISM,它没有显示为更新,我不得不自己手动完成。也许有些软件包可以做到这一点,而其他软件包则不能? 【参考方案1】:如果您像您说的那样使用 VS2013,您可以通过右键单击您的解决方案并选择“管理解决方案的 NuGet 包”来管理您的所有 NuGet 包。这将打开一个对话框,您可以在其中查看为解决方案中的所有项目安装的所有包以及所有具有可用更新的包。当您升级软件包时,VS 会处理所有所需的参考更改。如果包有重大更改,那么您仍然需要修复这些更改。
免责声明:我从未参与过 WPF 项目/解决方案,但对于 Web/Forms 应用程序,NuGet 包以这种方式处理。
【讨论】:
谢谢@djm61。请在我的原始帖子中查看我的更新。【参考方案2】:我能理解你的痛苦,因为我有和你一样的问题,但没有简单的方法。但当然你需要打破日常开发和依赖更新推出的不同过程。
对于我从事的项目,我使用在您从事的解决方案之间共享的公共存储库路径,您需要删除所有解决方案文件夹引用才能获得干净的状态。
对于您处理的每个解决方案,您需要修改指向公共目标存储库的属性组(我使用的是相对路径)
一旦所有的东西都设置好了,你就可以用脚本来执行更新了(我使用的是 python 运行时脚本)
您实际上可以查看setting up common nuget-packages-folder for reference updates 以了解详细信息,但看起来您正在查看自动化流程
【讨论】:
【参考方案3】:当我尝试在 Xamarin Studio 中升级具有 alpha 通道问题的多个包时遇到了类似的问题,它也没有 VS 2015 NuGet 管理器的细节。我最终写了一个very simple PowerShell script,我每天运行多次。
#
# This script updates local ibGib NuGet packages for mobileGib android app solution.
# For convenience in copy+paste in manager console:
# ../UpdateLocalNugetPackages.ps1
Update-Package commonGib
Update-Package ibGib
Update-Package languageGib.Biz
Etc.
我相信您可以根据自己的需要定制 NuGet 命令。
另外,万一您不知道,您绝对应该阅读NuGet command line reference。我可能弄错了,但听起来你的场景可以使用 Update 命令。
【讨论】:
以上是关于有没有一种聪明的方法来处理 NuGet 中的包依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 TeamCity Nuget Feed 上删除特定版本的包?