【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)
满足以下任一条件就会触发删除
- 参数checkout所在commit和目前本地cef仓库所在的HEAD计算出的hash不一致的时候,这两个hash值都是针对cef_dir目录计算的hash分别是HEAD和cef_checkout,换个简单易懂的说法,就是当前cef文件夹所在的branch和在使用
automate-git.py
时加上的checkout选项的值所指向的分支是不同的。 - 使用
automate-git.py
时没有加no-cef-update
选项并且cef文件夹不存在时,一般这种情况出现在第一次获取代码时。 - 使用
automate-git.py
时加上了force-clean
或者force-update
选项,但是注意,加上这两个的任何一个都会导致本地修改被废弃(discard local changes)。 - 使用
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
中均可找到相关代码