2. chromium開發工具--gclient


2. chromium開發工具--gclient

 

1.gclient簡介

gclient是谷歌開發的一套跨平台git倉庫管理工具,用來將多個git倉庫組成一個solution進行管理。總體上,其核心功能是根據一個Solution的DEPS文件所定義的規則將多個git倉庫拉取到指定目錄。例如,chromium就是由80多個獨立倉庫組成。

2.相關概念

  • hooks: 當gclient拉完代碼后執行的額外腳本;
  • solution: 一個包含DEPS文件的倉庫,可以認為是一個完整的項目;
  • DEPS: 一個特殊的文件,規定了項目依賴關系;
  • .gclient:一個特殊文件,規定了要拉取的solution,可由gclient config命令創建出來;
  • include_rules:指定當前目錄下哪些目錄/文件可以被其他代碼include包含,哪些不可以被include。

幫助命令:

gclient --help 

3.常用命令

3.1 gclient config

該命令會生成.gclient文件,用於初始化要拉取的solution,其內容記錄了solution倉庫的地址以及要保存的位置。
我們在拉取chromium代碼時第一步其實也是生成了.gclient文件,內容如下:

solutions = [
  {
    "url": "https://chromium.googlesource.com/chromium/src.git", # Solution倉庫地址 "managed": False, "name": "src", # 拉取代碼后存放的位置 "custom_deps": {}, # 自定義依賴的倉庫地址 "custom_vars": {}, }, ] 

以下是可以配置的字段:

  • name : checkout出源碼的名字
  • url : 源碼所在的目錄,gclient希望checkout出的源碼中包括一個DEPS的文件,這個文件包含了必須checkout到工作目錄的源碼的信息;
  • deps_file 這是一個文件名(不包括路徑),指在工程目錄中包含依賴列表的文件,該項為可選,默認值為"DEPS"
  • custom_deps 這是一個可選的字典對象,會覆蓋工程的"DEPS"文件定義的條目。一般它用作本地目錄中,那些不用checkout的代碼;
  • target_os : 這個可選的條目可以指出特殊的平台,根據平台來checkout出不同代碼

3.2 gclient sync

該命令用於同步solution的各個倉庫,它有一些參數:

  • -f--force:強制更新未更改的模塊;
  • --with_branch_heads: 除了clone默認refspecs外,還會clone "branch_heads" refspecs;
  • --with_tags: 除了默認的refspec之外,還可以clone git tags;
  • --no-history: 不拉取git提交歷史信息;
  • --revision <version>: 將代碼切換到 version 版本 ;
  • --nohooks:拉取代碼之后不執行hooks。

拉取代碼主要是根據DEPS文件來進行,它里面的內容包括:

  • deps: 要獲取的子依賴項:
   deps = {
       "src/outside" : "http://outside-server/trunk@1234", } 
  • vars:定義字符串變量,一般用於替代公共的字符串,然后通過Var來獲取實際的值:
    vars = {
        'chromium_git': 'https://chromium.googlesource.com' } deps = { 'src/chrome/browser/resources/media_router/extension/src': Var('chromium_git') + '/media_router.git' + '@' + '475baa8b2eb0a7a9dd1c96c9c7a6a8d9035cc8d7', 'src/buildtools': Var('chromium_git') + '/chromium/buildtools.git' + '@' + Var('buildtools_revision') } 
  • Hooks:DEPS包含可選的內容 hooks,也有重要的作用,它表示在sync, update或者recert后,執行一個hook操作,也即執行對應的腳本;
    hooks = [
      {
        #config git log format 'name': 'git-log', 'pattern': '.', 'action': [ 'python', 'src/git-log/config_commit.py', ], }, ... ] 
  • deps_os:根據不同的平台定義不同的依賴工程,可選的包括:
DEPS_OS_CHOICES = {
    "win32": "win``` "win": "win", "cygwin": "win", "darwin": "mac", "mac": "mac", "unix": "unix", "linux": "unix", "linux2": "unix", "linux3": "unix", "android": "android", } deps_os = { "win": { "src/chrome/tools/test/reference_build/chrome_win": "/trunk/deps/reference_builds/chrome_win@197743", ..... }, "ios": { "src/third_party/GTM": (Var("googlecode_url") % "google-toolbox-for-mac") + "/trunk@" + Var("gtm_revision"), .... }, ... } 

3.3 gclient runhooks

執行hooks。當你拉取代碼時使用了--nohooks參數時,就可以使用該命令來手動執行hooks。

3.4 gclient recurse

在每個倉庫中都執行一條git 命令

3.5 gclient fetch

相當於每個倉庫都執行了git fetch操作。

3.6 gclient diff

相當於每個倉庫都執行git diff 操作。

3.7 gclient status

相當於每個倉庫都執行git status 操作。

更多指令可以使用gclient --help查看。

4. 拉取代碼流程

使用gclient拉取代碼的時,主要使用以下命令:

 
 

Google 多源碼管理工具 gclient

漂流的代碼 2013-07-10 11:12:04 25797 收藏 2
展開
本文根據gclient幫助整理。

 

google的chromium項目是用gclient來管理源碼的checkout, update等。 gclient是google專門為這種多源項目編寫的腳本,它可以將多個源碼管理系統中的代碼放在一起管理。甚至包括將git和svn代碼放在一起。

 

gclient的sync,update等命令很容易學習和使用,不再多說,重點說明下和gclient密切相關的兩類文件.gclient和DEPS。

 

.gclient文件是gclient的控制文件,該文件放在工作目錄的最上層。".gclient"文件是一個Python的腳本(google真是對python情有獨鍾啊),定義了一組"solutions",格式類似如下

solutions = [
{ "name" : "src",
"url" : "svn://svnserver/component/trunk/src",
"custom_deps" : {
# To use the trunk of a component instead of what's in DEPS:
#"component": "https://svnserver/component/trunk/",
# To exclude a component from your working copy:
#"data/really_large_component": None,
}
},
]

name : checkout出源碼的名字
url : 源碼所在的目錄,gclient希望checkout出的源碼中包括一個DEPS的文件,這個文件包含了必須checkout到工作目錄的源碼的信息;
deps_file 這是一個文件名(不包括路徑),指在工程目錄中包含依賴列表的文件,該項為可選,默認值為"DEPS"
custom_deps 這是一個可選的字典對象,會覆蓋工程的"DEPS"文件定義的條目。一般它用作本地目錄中,那些不用checkout的代碼,如
"custom_deps": {
"src/content/test/data/layout_tests/LayoutTests": None,
"src/chrome/tools/test/reference_build/chrome_win": None,
"src/chrome_frame/tools/test/reference_build/chrome_win": None,
"src/chrome/tools/test/reference_build/chrome_linux": None,
"src/chrome/tools/test/reference_build/chrome_mac": None,
"src/third_party/hunspell_dictionaries": None,
},

         或者讓本地目錄從不同位置checkout一個新的代碼出來,或者checkout不同的分支、版本等。也可以用於增加在DEPS中不存在的新的項 目
target_os : 這個可選的條目可以指出特殊的平台,根據平台來checkout出不同代碼,如
target_os = ['android']
如果target_os_only值為True的化,那么,僅僅checkout出對應的代碼,如
target_os = [ "ios" ]
target_os_only = True


在每個checkout出的工程中,gclient期望發現一個DEPS文件(由deps_file來給定),它定義了工程不同部分都是如何checkout出來。

“DEPS”也是一個python腳本,最簡單的,如下:

deps = {
"src/outside" : "http://outside-server/trunk@1234",
"src/component" : "svn://svnserver/component/trunk/src@77829",
"src/relative" : "/trunk/src@77829",
}

deps的每個條目都包含一個key-value對,key是被checkout的本地目錄,而value就是對應的遠程URL。
如果路徑是以'/'開頭的,那么它是一個相對URL,相對與.gclient中URL地址。

 

URL通常包含一個版本號,以便鎖定源碼在特定版本上。當然,這是可選的。如果沒有,那么它將獲取指定分支上最新的版本。


DEPS還可以包含其他類型的數據,如vars, 

vars = {
'pymox':
'http://pymox.googlecode.com/svn',
'sfntly':
'http://sfntly.googlecode.com/svn',
'eyes-free':
'http://eyes-free.googlecode.com/svn',
'rlz':
'http://rlz.googlecode.com/svn',
'smhasher':
'http://smhasher.googlecode.com/svn',
...
}

vars定義了一組變量,在后面,可以通過Var(xxx)來訪問。Var(xxx)返回一個字符串,故此,也可以進行操作,如
'src/third_party/cros_dbus_cplusplus/source':
Var("git.chromium.org") + '/chromiumos/third_party/dbus-cplusplus.git@5e8f6d9db5c2abfb91d91f751184f25bb5cd0900',
   'src/third_party/WebKit':
      Var("webkit_trunk")[:-6] + '/branches/chromium/1548@153044',
第二個自立,Var("webkit_trunk")[:-6]是一個python表達式,表示取得"webkit_trunk"表示的字符串的最后6個


Hooks:DEPS包含可選的內容 hooks,也有重要的作用,它表示在sync, update或者recert后,執行一個hook操作。

如果使用 --nohooks選項(hook默認執行),那么在gclient sync或者其他操作后,不會執行hook。你可以通過gclient runhooks來單獨執行; 如果有 gclient sync --force,那么,無論sync是否成功,都會執行hook。

hook在DEPS中的寫法,一般是:

hooks = [
{ "pattern": "\\.(gif|jpe?g|pr0n|png)$",
"action": ["python", "image_indexer.py", "--all"]},
{ "pattern": ".",
"name": "gyp",
"action": ["python", "src/build/gyp_chromium"]},
]

hooks包含一組hook,每個hook有幾個重要項:
pattern 是一個正則表達式,用來匹配工程目錄下的文件,一旦匹配成功,action項就會執行
action 描述一個根據特定參數運行的命令行。這個命令在每次gclient時,無論多少文件匹配,至多運行一次。這個命令和.gclient在同一目錄下運行。如果第一個參數是"python",那么,當前的python解釋器將被使用。如果包含字符串 "$matching_files",它將該字符串擴展為匹配出的文件列表。
name 可選,標記出hook所屬的組,可以被用來覆蓋和重新組織。
deps_os: DEPS中定義不同平台依賴關系的項目,如

deps_os = {
"win": {
"src/chrome/tools/test/reference_build/chrome_win":
"/trunk/deps/reference_builds/chrome_win@197743",

"src/third_party/cygwin":
"/trunk/deps/third_party/cygwin@133786",

.....
},

"ios": {
"src/third_party/GTM":
(Var("googlecode_url") % "google-toolbox-for-mac") + "/trunk@" +
Var("gtm_revision"),

"src/third_party/nss":
"/trunk/deps/third_party/nss@" + Var("nss_revision"),
....
},
...
}
deps_os指定不同平台的依賴,它可以包含多種平台,和.gclient中的target_os對應。這種對應關系如下:
DEPS_OS_CHOICES = {
"win32": "win",
"win": "win",
"cygwin": "win",
"darwin": "mac",
"mac": "mac",
"unix": "unix",
"linux": "unix",
"linux2": "unix",
"linux3": "unix",
"android": "android",
}

 


————————————————
版權聲明:本文為CSDN博主「漂流的代碼」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/doon/article/details/9287693


免責聲明!

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



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