【chromium】cef是如何进行版本控制的?

搜了搜cef相关的文章,内容大多是 如何下载源码,如何编译,还有一些源码剖析,但是很少有人说明对cef进行开发时如何保存修改,使用git进行修改后的版本控制。

cef是怎么做的?

cef源码分为两个部分,一个部分是cef的代码,另一个部分是chromium源码,如果按照cef官网给的指引下载代码,一般cef代码会放在cef目录下,chromium代码会放在chromium目录下,所以说git仓库是不同的。在进行编译的时候需要执行cef_create_projects.bat脚本,这个脚本首先会将整个cef目录拷贝到chromium\src目录下,然后会将cef\patch\patches打到chromium上面,打完patch之后再使用gn生成ninja文件,之后才进行编译。

因此如果要修改cef的源码,需要在外侧的cef目录下修改,而不是在chromium\src\cef目录下修改,否则在生成项目文件的时候一拷贝就把修改给覆盖掉了。修改chromium源码的话就在chromium\src目录下修改就好了。

版本管理

构建完cef之后,chromium的src仓库处于修改后未add未commit的状态(第三方仓库可能也会有),大量的patch带来的修改就这么放在暂存区

但是cef仓库没啥修改,暂存区空空如也

如何不抛弃本地的修改?

假设修改了cef的源码,现在需要让修改后的源码起作用,前文提到,cef源码会被拷贝到chromium\src\cef目录下,然后参与chromium目标的编译,因此修改cef源码需要在cef里面,而且必须要有拷贝这个动作,覆盖掉旧版本的代码,然后编译链接,才能得到修改后的编译目标

cef何时会拷贝?

如上述所说,更新代码是将cef目录拷贝到src目录下覆盖,编译后得到新的目标,那么在什么情况下会拷贝呢?

要想得到修改后的编译目标,必须要让修改的cef源码被拷贝到chromium\src目录下

elif os.path.exists(cef_dir) and not os.path.exists(cef_src_dir):
  # Restore the src/cef directory.
  copy_directory(cef_dir, cef_src_dir)

如果要拷贝,cef_src_dir目录必须不存在,也就是必须删掉它才行,如果不是手动删掉,而是让自动化脚本去删,则必须要cef_checkout_changed为true,如下述代码所示,一般cef_dir不会等于cef_src_dir

if cef_checkout_changed:
  if cef_dir != cef_src_dir and os.path.exists(cef_src_dir):
    # Delete the existing src/cef directory. It will be re-copied from the
    # download directory later.
    delete_directory(cef_src_dir)

满足以下任一条件就会触发删除

  1. 参数checkout所在commit和目前本地cef仓库所在的HEAD计算出的hash不一致的时候,这两个hash值都是针对cef_dir目录计算的hash分别是HEAD和cef_checkout,换个简单易懂的说法,就是当前cef文件夹所在的branch和在使用automate-git.py时加上的checkout选项的值所指向的分支是不同的。
  2. 使用automate-git.py时没有加no-cef-update选项并且cef文件夹不存在时,一般这种情况出现在第一次获取代码时。
  3. 使用automate-git.py时加上了force-clean或者force-update选项,但是注意,加上这两个的任何一个都会导致本地修改被废弃(discard local changes)。
  4. 使用automate-git.py时加上了force-cef-update选项,同样也会导致本地修改被废弃。

因此为了满足新修改的代码应用到编译目标中,每个新功能都应该新开一个分支(这也算是个git的开发流程),验证没有问题后先生成patch(因为是对暂存区生成的patch),然后commit提交,合并到主分支上(假设主分支名为3770),然后再从3770分支切出来一个新的分支进行新的功能开发。

是不是很麻烦?

也可以修改下automate-git.py的代码。添加一个强制覆盖的选项。

总结

也就是说,cef并没有管理chromium代码,而是自己做了一套自动化脚本,拉取cef代码的同时,去google那边拉取chromium代码,而针对chromium相关的修改,则是以patch文件的形式,存放在cef的代码仓库,当需要cef进行编译的时候,也是调用cef准备的脚本自动打patch,生成.ninja文件,然后再使用ninja进行编译链接,得到产物。

PS:上述的操作在automate-git.py中均可找到相关代码

posted @ 2019-12-20 20:09  leno米雷  阅读(1199)  评论(0编辑  收藏  举报