如何处理不稳定的API的全球使用的框架

How to deal with unstable API of a globally used framework

本文关键字:API 框架 不稳定 何处理 处理      更新时间:2023-10-16

情况:

我们的首席架构师创建了一个C++库;运行时";对于我们的工作领域(它们实际上是几个库——想想sdl、sdl_net、sdl_ttf,但是有一个C++接口,它们总是应该一起使用,即使您可能只需要其中一个(。

也就是说,这些库链接到一堆CRUD应用程序、其他(更具体的(库(想想基于sdl的sprite库(和更大规模的应用程序(客户端/服务器、远程GUI(。

问题:

由于一系列原因(当然,时间不够,是其中之一(;运行时";图书馆仍有变动。可能会引入新的类,现有的类可能会被拉入类层次结构,方法参数可能会更改等等。由于没有ABI,链接运行时的代码将中断,并且在没有适当版本控制的情况下动态链接时,生产软件将崩溃。

拒绝的解决方案:

  • 对运行库的更改应该引入一个新版本。当myrt.so.2发货时,链接到myrt.so.1的二进制文件仍然可以工作,因为myrt.so.1(在一段时间内(不会被删除

拒绝的理由:将会有很多新的库版本"污染";生产环境。最坏的情况是每个二进制文件都有自己的myrt版本。

  • 静态链接

拒绝的原因:加上明显的膨胀,上面的最后一句话实际上也适用于此。

  • 可能保留两个myrt版本,并重建在运送新的myrt时可能会中断的依赖关系

拒绝的原因:没有时间测试所有依赖项的功能(只有很少的自动测试(,并且运送未经测试的二进制文件的风险被认为太高。


问题

我们还能做什么?你认为有什么方法可以通过处理拒绝声明来恢复其中一个拟议的解决方案吗?

它可能是在纠正症状而不是原因(缺乏自动测试,缺乏真正创建稳定的API的资源等(。老实说,我看不到解决更大问题的方法,尽管已经采取了更好的测试措施。

第四个解决方案

以向后兼容的方式更改库的ABI。但这并不容易。复杂性取决于类的初始体系结构(d指针的使用等(。您可能需要引入一个巨大的突破来更改类的体系结构,以便在未来安全地添加ABI。

在这个领域有用的文章:

  • https://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
  • https://techbase.kde.org/Policies/Binary_Compatibility_Examples
  • http://lvc.github.io/abi-compliance-checker/#Articles

ABI兼容性自动化分析的有用工具:

  • abi合规性检查器
  • abi翻斗车