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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM