搜了搜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中均可找到相关代码

【chromium】cef是如何进行版本控制的?的更多相关文章

  1. Chromium CEF 2623 -- 支持 xp 的最后一个版本源码下载和编译步骤

    背景 因为项目需要在客户端中内嵌浏览器,需要支持 xp 操作系统和播放视频,但 CEF 2623 以后的版本已经不支持 xp 操作系统,也不再提供 2623 版本的二进制发布包下载,只好自己手动编译. ...

  2. Chromely

    Chromely Chromely is a lightweight alternative to Electron.NET, Electron for .NET/.NET Core develope ...

  3. 利用 Chromium Embedded Framework (CEF) 定制提取 Flash 视频的浏览器

    功能介绍: 利用 CEF 分析网页源码, 提取 flash 视频的代码. 提取的视频代码 LoadString 和 JS 两种方式重新插入到浏览器. (CEF_3.2171.1979_win32 - ...

  4. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  5. Chromium与CEF的多进程模型及相关參数

    CEF基于Chromium,也是多进程模型.关于进程模型.參考这里:https://www.chromium.org/developers/design-documents/process-model ...

  6. 【chromium】 cef源码下载

    至少需要17GB的磁盘空间,不光有CEF源码,还会下载chromium源码.编译master分支的话,如果编译到chromium可能会需要windows sdk,windows sdk的版本可以参考下 ...

  7. cef chromium 编译

    前言 目前客户端引用了cef sharp库来嵌入web页面 cef sharp是对cef (chromium embed framework)的c#封装 cef是对chromium内核的c++封装 什 ...

  8. Chromium Embedded Framework (CEF)_3.2171.2069_v20170606_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 [增加了960x90% 和 1280x90%] 这次修改是主要针对 YY web 直播平台 ...

  9. Chromium Embedded Framework (CEF)_3.2171.1979_v20170602_x86.tar.xz

    CEF 为观看各个直播平台而特此修改的浏览器 可以单独提取 Flash 视频, 并可以修改视频的大小等功能 这次修改是主要针对 YY web 直播平台 对录屏的朋友有很大帮组 CEF_3.2171.1 ...

随机推荐

  1. java--String与int相互转换

    字符串与int类型的互相转换 String ---> int //方式一:Integer(String s) //demo: Integer i = new Integer("10&q ...

  2. django2外键,F表达式,Q表达式

    一对多 环境 两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系 class Category(models.Model): category = mod ...

  3. Linux进程管理之top

    关于Linux进程查看,前面讲解了ps命令,下面拉介绍另一个命令top ps:静态查看 top:动态查看 动态查看进程的状态 # top [root@wei ~]# top top - 18:38:4 ...

  4. php对接app支付宝支付出错Cannot redeclare Decrypt()

    报错原因: alipaySDK中定义的Encrypt()/Decrypt()函数与Laravel中定义的Encrypt()/Decrypt()函数重名了. 解决办法: 修改alipaySDK中定义的函 ...

  5. Oracle ASMCMD命令参考

    Oracle ASMCMD命令参考 0.什么是asm ASM它提供了以平台无关的文件系统.逻辑卷管理以及软RAID服务.ASM可以支持条带化和磁盘镜像,从而实现了在数据库被加载的情况下添加或移除磁盘以 ...

  6. AtCoder - 4496 G - k-DMC

    AtCoder - 4496 G - k-DMC 题目 长度为n的字符串,q次查询,问"DMC"(不要求连续)在字符串中出现的次数,其中D和M的距离不超过k. 错误思路 通过遍历字 ...

  7. S3C2440_LCD控制器

    1.LCD控制器主要有两方面的功能: 1)从framebuffer中取出某个像素的数据: 2)配合其他信号,一起将这个数据发送给LCD 不管是2440,还是其他型号的ARM芯片.它们的LCD控制器的功 ...

  8. 201871010123-吴丽丽《面向对象程序设计(Java)》第四周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  9. 前端页面模拟浏览器搜索功能Ctrl+F实现

    <html> <head> <style type="text/css"> .res { color: Red; } .result{ back ...

  10. day 14

    Sow an act, and you reap a habit. Sow a habit, and you reap a character. Sow a character, and you re ...