文章

谷歌开发工具depot_tools和gclient简介

1. depot_tools

depot_tools 是用来管理与 Chromium 源代码和 Chromium 开发过程的一系列工具集, depot_tools 和 gclient的关系是, depot_tools 工具集里面包含了 gclient 工具,webrtc和 chromeium的开发都离不开它们。此外像webrtc编译时用到的 gn,ninja等工具都包含在这里面。

depot_tools的安装配置可以参考这里

包含的工具列表,大部分也没有用过,了解下就好:

  • gclient: 管理 subversion 和 git 检出的元检出工具。适用于 Linux、OS X 和 Windows,支持 svn 和 git。

  • gcl: subversion 的 Rietveld 代码审查工具。gcl 工具运行预提交脚本。

  • git-cl: git 的 Rietveld 代码审查工具。git-cl 工具运行预提交脚本。

  • svn [仅限 Windows]: Chromium 开发的 subversion 客户端。

  • drover: 快速恢复 svn 提交。

  • cpplint.py: 检查 C++ 风格合规性。

  • pylint: 检查 Python 风格合规性。

  • presubmit_support.py: 运行 PRESUBMIT.py 预提交检查。

  • repo: repo 工具。

  • wtf: 显示 chromium os 检出中的活动 git 分支。

  • weekly: 显示特定开发者自特定日期以来的 git 检出日志。

  • git-gs: git grep 的封装,适用于相关的源类型。

  • zsh-goodies: zsh 用户的补全。

2. gclient

gclient 是 Python 开发的一套跨平台的git仓库管理工具,类似 git 的 submodule,用于管理模块化依赖项,可以将多个git仓库组成一个solution进行管理,这样的好处是,一个git仓库可以被多个solution共用。

gclient 的核心功能是将solution中由DEPS文件定义的所有git仓库拉取到指定的目录。此外它添加了一些其它的辅助功能,比如Hooks等功能。

2.1. 一些概念

  • Solution: 一个包含DEPS文件的仓库,DEPS文件中记录了该solution所有依赖的项目;
  • roll_deps: 一个gclient 的辅助工具,用于更新DEPS文件中某个项目的代码版本;
  • Gerrit/Rietveld: 一个Code Review系统,可以和git/svn集成;
  • Hooks: gclient中的术语,当gclient拉完代码之后执行的额外脚本;
  • .gclient: 一个由 gclient config 命令创建出来的文件,内部记录了要拉取的solution;
  • DEPS: 一个文件,gclient 用于管理项目依赖的一个文件,记录了项目的依赖关系;
  • CL: Change List ,类似 git 的 diff 和 pack;
  • LKGR: Last Known Good Revision,一个git tag,记录了最新的经过完整测试的版本;
  • managed: gclient 的一种模式,该模式已过时,不推荐使用;该模式用于帮助那些对git不熟悉的开发者更简单的使用gclient;
  • inlcude_rules: 指定当前目录下哪些目录/文件可以被其他代码inlcude,那些不可以被inlcude;
  • specific_include_rules: 作用同include_rules,但是可以使用通配符;

2.2. .gclient 文件

实际上是一个 Python 脚本, 一个 solution的组成内容如下:

1
2
3
4
5
6
7
8
9
10
solutions = [
  {
    "name": "src",
    "url": "https://webrtc.googlesource.com/src.git",
    "deps_file": "DEPS",
    "managed": False,
    "custom_deps": {},
  },
]
target_os = ["ios", "mac"]

重点关注:

  • solutions:一个数组,指定将要获取的项目,上一节也有介绍到。
  • target_os:一个可选的(目标)操作系统数组,用于获取特定操作系统的依赖项。
  • deps_file: 每个项目都可以包含一个可选的 DEPS 文件, 下面会详细介绍到
  • name:实际上是检出的路径。
  • url:要获取/克隆的远程存储库。
  • custom_deps:(可选)覆盖子 DEPS 文件中的 depsdeps_os 变量中指定的依赖项。当您想要获取可写检出而不是默认的只读检出依赖项时很有用
  • custom_vars:(可选)覆盖子 DEPS 文件中 vars 中定义的变量

2.3. DEPS 文件

webrtc 源码中的 DEPS位于 src/DEPS -> 这里查看

DEPS 文件指定项目的依赖项,实际上也是一个 Python 脚本,内容组成类似下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
deps = {
  # TODO(kjellander): Move this to be Android-only.
  'src/base':
    'https://chromium.googlesource.com/chromium/src/base@aa6dbe6d6a68e6503360a7e0e18b8464c56fc159',
  'src/build':
    'https://chromium.googlesource.com/chromium/src/build@5bce81deee6d30ac58c45f6cd53e859c62780687',
  'src/buildtools':
    'https://chromium.googlesource.com/chromium/src/buildtools@94d7b86a83537f8a7db7dccb0bf885739f7a81aa',
  # Gradle 6.6.1. Used for testing Android Studio project generation for WebRTC.
  'src/examples/androidtests/third_party/gradle': {
    'url': 'https://chromium.googlesource.com/external/github.com/gradle/gradle.git@f2d1fb54a951d8b11d25748e4711bec8d128d7e3',
    'condition': 'checkout_android',
  },
  'src/ios': {
    'url': 'https://chromium.googlesource.com/chromium/src/ios@9e33110a5d6d22342302264579598e42c4623ebb',
    'condition': 'checkout_ios',
  },
  'src/testing':
    'https://chromium.googlesource.com/chromium/src/testing@a1b47952f3737c536f14a74ff70bc12ed2c1ac7d',
  'src/third_party':
    'https://chromium.googlesource.com/chromium/src/third_party@91945cadc24feea7b44e1682d17844b6ab508d6d',
}

hooks = [
  {
    # This clobbers when necessary (based on get_landmines.py). It should be
    # an early hook but it will need to be run after syncing Chromium and
    # setting up the links, so the script actually exists.
    'name': 'landmines',
    'pattern': '.',
    'action': [
        'python3',
        'src/build/landmines.py',
        '--landmine-scripts',
        'src/tools_webrtc/get_landmines.py',
        '--src-dir',
        'src',
    ],
  },
  ]

可以指定以下变量

  • deps:要获取的子依赖项的字典,包含了各个子仓库信息。
  • hooks:同步后运行的钩子, 参考gclient runhooks

2.4. gclient 常用命令

2.4.1. gclient config

该命令会生成.gclient文件,用于初始化要拉取的solution,其内容记录了solution仓库的地址以及要保存的位置。 我们在拉取webrtc代码时第一步其实也是生成了.gclient文件,内容如下:

1
2
3
4
5
6
7
8
9
10
solutions = [
  {
    "name": "src",
    "url": "https://webrtc.googlesource.com/src.git",
    "deps_file": "DEPS",
    "managed": False,
    "custom_deps": {},
  },
]
target_os = ["ios", "mac"]

2.4.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。

2.4.3. gclient runhooks

执行hooks。当你拉取代码时使用了--nohooks参数时,就可以使用该命令来手动执行DEPS里的 hooks。

2.4.4. gclient fetch

相当于每个仓库都执行了git fetch操作。

2.4.5. gclient diff

相当于每个仓库都执行git diff 操作。

2.4.6. gclient status

相当于每个仓库都执行git status 操作。

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

本文由作者按照 CC BY 4.0 进行授权