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