谷歌开发工具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
文件中的deps
和deps_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
查看。