更新依赖包时强制更新包版本
Posted
技术标签:
【中文标题】更新依赖包时强制更新包版本【英文标题】:Force package version update when dependency package is updated 【发布时间】:2019-01-11 15:52:48 【问题描述】:问题陈述
我们有一个本地 nuget 商店,其中包含许多应用程序使用的组件列表。
它们总是有一个核心组件(比如PackageB
)定义为依赖项。从 nuget 图的角度来看,我们可以说那里有很多 cousin-dependencies。
假设核心组件PackageB
具有定义为InterfaceA
和InterfaceC
的接口类型。
PackageA
具有实现 InterfaceA
的 ClassA
。
PackageC
具有实现 InterfaceC
的 ClassC
。
PackageA
和PackageC
都将PackageB
定义为依赖项,如上图所示。
作为更新的一部分,我们对InterfaceA
和ClassA
进行了一些更改。因此,为PackageA
和PackageB
创建了新版本,我们在我们的应用程序中升级到了这些版本。
我们没有意识到,另一个团队也对InterfaceC
、ClassC
进行了类似的更改;并为PackageC
生成了一个新版本——我们的应用程序中不需要的更新。所以我们没有升级PackageC
。
没有编译时错误。只有在测试应用程序时,我们才开始遇到以下错误:
“ClassC 类型的 VTable 设置失败”(android 项目)
问题的根本原因是当我们更新PackageB
时,我们最终得到了更新的InterfaceC
,它不再与旧版本的PackageC
兼容。 所以,升级到最新版本的PackageC
解决了这个问题。
问题
为了避免这个问题,我希望能够在目标项目中更新PacakgeB
之类的核心包时强制更新所有依赖包。
即如果PacakgeB
被更新,它应该自动强制更新到PacakgeA
和PackageC
。这可能吗?
我假设有一些规范可以指示 nuget 或 msbuild 在应用程序项目级别处理此问题。
【问题讨论】:
您是否考虑过为您的应用添加一些预构建操作?我只将它用于从一个方向复制库到另一个方向,但我认为可以添加一些脚本来分析 package.config 文件并在不同版本的情况下停止构建。就像一个想法,所以我不知道如何实现它 【参考方案1】:您似乎需要在 app.config 中指定正确的版本
这是我项目中的 app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="XLabs.Serialization" publicKeyToken="d65109b36e5040e4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5782.15703" newVersion="2.0.5782.15703" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
您需要更改publicKeyToken
并设置正确的版本号
【讨论】:
据我了解,这种方法仍然需要手动更新包 (PakageC) 才能使新程序集可用于重定向。手动更新是我在这里试图避免的。 是的。这只是解决问题然后你有不同版本的同一个库。以上是关于更新依赖包时强制更新包版本的主要内容,如果未能解决你的问题,请参考以下文章