只要每个人都能承受成本,收益和风险,这样做确实没有错。
...修复程序似乎很简单...自己修补代码
当您有工作要做时,完善(拥有您真正想要的第三方库)就是足够好的敌人(自己进行修补),有时您必须做这样的事情。我已经完成了许多项目,在这些项目中,我们购买了商业图书馆的源许可证,因此我们可以在供应商解决之前解决问题。
……批评者想争辩说,这几乎总是一个坏主意,因为它有风险并带来麻烦的复杂性。
如果您没有杂物处理别人的代码,识别问题并编写修复程序,那将是一个坏主意。无论代码是内部的还是第三方的,都是如此。唯一的区别是,它是落在小腿上还是扔在小隔间或建筑物墙壁上。
如果您的批评者只是在不考虑不执行此补丁程序的成本的情况下将想法搁置一旁,那么他们就没有在做作业。如果您有很多内部代码受补丁程序所修复的错误的影响,则必须仔细检查并更改它以解决该问题,然后重新测试所有内容以确保其正常运行。然后,如果您将软件包升级到错误修复的版本,则可能必须找到并删除解决方法,然后再次进行测试。也有这样做的风险,例如丢失更改的案例或测试不足。就个人而言,如果我有机会从源头上修复一个错误,我宁愿在那里做,而不是用苍蝇拍追逐其余的代码,希望我能得到一切。
...代码更改是由我们完成的...它必须是我们代码库的一部分...我们必须将其作为一个新项目进行介绍,并将其自动生成合并到我们的生成过程中。
如果您正在制作补丁程序,则该补丁程序是您自己的代码的一部分,这意味着您必须使其成为流程的一部分。这与向系统中添加100%的代码没有什么不同。将第三方分发视为神圣不可侵犯,并将其放入模块中,就像源代码一样。您编写的所有修补程序都与它一起存储在单独的文件中,并在构建过程中应用。这样,您始终可以从干净的源代码到修补的源代码,再到内置产品,并且可以准确显示正在发生的事情。(有些人将其解压缩,手动打补丁,重新打包并将其存储在版本控制中。这很糟糕。)
...我们会将他们的代码从其源代码控制存储库中提取到我们的代码中,而我们丢失任何代码更改背后的历史记录...
如果您将第三方库视为第三方依赖项,那么就没有该历史记录,也不会丢失任何内容。如果您可以继续访问第三方存储库,则可以根据需要进行咨询。第三方发行版应像无变化的斑点一样对待,您无需更改即可将其签入自己的系统。如果您需要查看正在使用的版本与更高版本之间的更改,则可以这样做,并且,如果需要,可以为旧版本提供包含所需更改的补丁程序。
同样,对于需要进行如此小的代码更改而言,这似乎太复杂了。
如果您的构建过程足够复杂,那么添加此过程就不会比添加您自己的代码困难得多。要使它自动解包/修补/构建过程要花费很少的精力,但是一旦完成,它就永远存在。现在可能有一个错误,但将来可能有二十个。如果有的话,您会更高兴为现在支持所有工作奠定基础,因为这将使处理下19个工作减少很多。