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拉取代碼的時,主要使用以下命令:


免責聲明!

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



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