更新依赖包时强制更新包版本

Posted

技术标签:

【中文标题】更新依赖包时强制更新包版本【英文标题】:Force package version update when dependency package is updated 【发布时间】:2019-01-11 15:52:48 【问题描述】:

问题陈述

我们有一个本地 nuget 商店,其中包含许多应用程序使用的组件列表。

它们总是有一个核心组件(比如PackageB)定义为依赖项。从 nuget 图的角度来看,我们可以说那里有很多 cousin-dependencies。

假设核心组件PackageB 具有定义为InterfaceAInterfaceC 的接口类型。

PackageA 具有实现 InterfaceAClassAPackageC 具有实现 InterfaceCClassC

PackageAPackageC 都将PackageB 定义为依赖项,如上图所示。

作为更新的一部分,我们对InterfaceAClassA 进行了一些更改。因此,为PackageAPackageB 创建了新版本,我们在我们的应用程序中升级到了这些版本。

我们没有意识到,另一个团队也对InterfaceCClassC进行了类似的更改;并为PackageC 生成了一个新版本——我们的应用程序中不需要的更新。所以我们没有升级PackageC

没有编译时错误。只有在测试应用程序时,我们才开始遇到以下错误:

“ClassC 类型的 VTable 设置失败”(android 项目)

问题的根本原因是当我们更新PackageB 时,我们最终得到了更新的InterfaceC,它不再与旧版本的PackageC 兼容。 所以,升级到最新版本的PackageC 解决了这个问题。

问题

为了避免这个问题,我希望能够在目标项目中更新PacakgeB 之类的核心包时强制更新所有依赖包。

即如果PacakgeB 被更新,它应该自动强制更新到PacakgeAPackageC。这可能吗?

我假设有一些规范可以指示 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) 才能使新程序集可用于重定向。手动更新是我在这里试图避免的。 是的。这只是解决问题然后你有不同版本的同一个库。

以上是关于更新依赖包时强制更新包版本的主要内容,如果未能解决你的问题,请参考以下文章

为啥更新包时“composer.json”没有更新?

软件安装&更新&卸载

yarn 如何更新所有的依赖包到最新版本

maven缺少依赖包,强制更新命令

npm更新包

eclipse maven 手动添加依赖包时,不会自动搜索怎么办?