请问项目中修改第三方包的正确姿势是什么?

2021-11-14 11:18:51 +08:00
 Phishion

有一个第三方包,我需要进行一些小的修改才能使用,我目前知道 2 个方法

  1. 直接修改第三方包的源文件,然后通过 Docker 映射文件的方式覆盖掉 优点是项目文件是干净的,缺点是如果第三方包如有升级,出现 bug 可能想不到排查这里。

  2. 在项目中导入第三方包,然后手动写好需要修改的类 / 函数,然后进行赋值 优点是第三方包假设有升级,也将影响降低到最低,缺点是可能有我未测出的 bug 。

提 PR 的话我觉得期待得到及时合并不太现实,你们遇到这样的问题都是怎么解决的呢?

2583 次点击
所在节点    Python
9 条回复
wxlwsy
2021-11-14 11:40:33 +08:00
直接改源码吧.上线后几乎不会再有机会更新这个包了
renmu123
2021-11-14 11:44:16 +08:00
把包复制出来,然后改源码,然后提 pr ,修复之后再删除包。
或者用猴子补丁之类的
xumng123
2021-11-14 12:26:19 +08:00
两种方法:
1. 锁好第三方包版本号,修改代码,以后升级就不升级这个包
2. 继承该包并覆盖对应的部分
ClericPy
2021-11-14 13:19:17 +08:00
目前基本习惯了打补丁, 大部分情况直接覆盖方法或者继承派生一下就够了, 少数情况 (Cython) 就把他们抽象的东西挨个拼出个新的来, 一般流行的包都抽象的挺彻底的

至于未测出的 bug, 改抽象不改具体一般还好, 虽然我现在基本遇到百年不更新的都找到替代品了
ch2
2021-11-14 14:32:24 +08:00
锁定版本号,装完包之后跑个 patch 脚本
ebingtel
2021-11-15 09:16:29 +08:00
在启动的时候,把对应的对象,用自己的代码覆盖掉就行……维护简单
thevita
2021-11-15 10:38:35 +08:00
提 pr+patch+dependent-bot
2i2Re2PLMaDnghL
2021-11-15 14:54:01 +08:00
以最推荐到最不推荐排序

提 PR 直接并入上游
组合+继承,一套 OOP 组合拳
猴子补丁
覆盖 patch ,如果是大更新 patch 会失败,如果上游有比较重要的安全性更新 dependent-bot 会提示
使用你自己的 fork ,采用 pip install git+<giturl> 的形式引入
使用你自己的 fork ,采用 git 子模块引入,锁 commit hash

多线理论上可以同时操作。
Phishion
2021-11-15 16:46:33 +08:00
@2i2Re2PLMaDnghL 牛逼,终结了这个问题

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

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

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

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

© 2021 V2EX