Python 开源项目在进行依赖升级的时候, 是如何规避掉大部分 bug 的?

150 天前
 chaleaochexist

我司最近进行安全审查, 要求所有的第三方依赖包的版本不能过期. 那就涉及到版本升级问题了, 但是升级就会带来 api 不兼容.

我能想到的就是开源项目也有类似这样的问题.他们是如何解决 api 可能不兼容问题的?

2306 次点击
所在节点    Python
23 条回复
Goooooos
150 天前
申请人力测试
AntiEoom
150 天前
这是哪位领导一拍脑袋想出来的 KPI ,所有第三方都要是最新版,想想最近的 CrowdStrike 不怕死的很难看嘛。
chaleaochexist
150 天前
@AntiEoom 不不不 你这个太极端了
不是非得最新版.
renmu
150 天前
人力解决
huangyezhufeng
150 天前
首先把你的测试覆盖度提到 90%以上,然后核心依赖逐个升级
chaleaochexist
150 天前
@huangyezhufeng 开源项目就是依靠单测实现的是吗?
crackidz
150 天前
有自动化测试吗?即便 API 兼容,也可能实现不兼容
gotounix
150 天前
很难做到,如果只是使用第三方库,那还好。如果对第三方库进行了定制,哪怕是继承,都又很大程度上会出问题。

比如这个: https://github.com/mfogel/django-timezone-field/pull/137#issuecomment-2219793300

我是使用 https://github.com/celery/django-celery-beat/ 这个库,然后序列化的时候重写了 timezone_field.TimeZoneField 类。而且,我在 requirements.txt 中使用了 >=。

导致使用这个模板项目,新建项目、安装完依赖后,初始化的时候报错。

这只是一个很简单的例子,很多组件库都有 BREAKING 修改,如果在 CHANGELOG 中有指明还好,没有指明就是一个暗坑。而且,即便指明了,你升级的时候也不会去看每个包的 CHANGELOG 。
huangyezhufeng
150 天前
@chaleaochexist #6 https://github.com/tiangolo/sqlmodel/issues/654

参考下这个吧,如果升级的依赖有明确的 break change ,每个依赖要单独升。比如从 1.x 升到 2.x ,这里的做法是先升到 1.x 最新版,然后做好测试;然后再慢慢升 2.x 。整个是个挺繁琐的过程...
tangtang369
150 天前
开源项目第三方依赖包都是固定版本的,升级版本大概率会出现运行不起来的情况
shakeyo
150 天前
c++er 成为轮子不是没有理由的
fcfangcc
150 天前
无解,纯靠测试。即使 API 兼容,表现也可能不一样。

最近升级了 fastapi 和 pydantic 版本,改了几十个文件。测试了大部分功能后,上线还是发现了好几个不兼容引起的 error
Meteora626
150 天前
很多都不测,上周遇到的 transformer 和 deepspeed 的问题,搜 GitHub 一堆人提,老版本就没事
whoosy
150 天前
快跑
tomczhen
150 天前
这个目标达成的成本会很高。

首先,Python 现有的包管理工具我是没找到一个能锁定传递依赖的方法,只能将传递依赖变成主动依赖。

其次,一个环境下一个包只能有一个版本。

另外是否 break change 无法从版本号确定。一旦项目依赖复杂,没有完整的测试覆盖无法发现问题。

而发现问题后,也会遇到必须由上游依赖包来解决的情况。这时想自己解决只能通过维护额外分支解决。
prosgtsr
150 天前
开源项目。很有可能就不解决了。用户使用发现了问题再去看要不要修改依赖版本
Maerd
149 天前
靠测试用例全覆盖。。。提交 pr 的时候基本上都要求通过测试才能合并
julyclyde
149 天前
你们公司这么上进啊?
要是腾讯肯定是勒令禁止升级以免发生“稳定性”问题,而根本不去研究到底哪个代码的变成引起的问题
julyclyde
149 天前
@tomczhen 他们的理念大概是:
依赖关系是这个版本的一部分,你固定了这个版本,自动就固定了依赖关系

但是问题是依赖关系有时候不写依赖于某个别的包的具体版本,而只写依赖于这个包名。唉
chaleaochexist
149 天前
@julyclyde
>>> 你们公司这么上进啊?
你猜是因为什么原因? 那肯定是因为 KPI 啊.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1059136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX