为了账号安全,请及时绑定邮箱和手机立即绑定

Google 多源码管理工具 gclient

标签:
人工智能

备注:本文摘自https://blog.csdn.net/cabbage2008/article/details/52766821,非常感谢博主的分享,本次转载仅用于学习记录,如有侵权请及时告知,本人会及时删除。


本文根据gclient帮助整理。

google的chromium项目是用gclient来管理源码的checkout, update等。 gclient是google专门为这种多源项目编写的脚本,它可以将多个源码管理系统中的代码放在一起管理。甚至包括将git和svn代码放在一起。


gclient的sync,update等命令很容易学习和使用,不再多说,重点说明下和gclient密切相关的两类文件.gclient和DEPS。


.gclient文件是gclient的控制文件,该文件放在工作目录的最上层。".gclient"文件是一个Python的脚本(google真是对python情有独钟啊),定义了一组"solutions",格式类似如下

  1. solutions = [  

  2.   { "name"        : "src",  

  3.     "url"         : "svn://svnserver/component/trunk/src",  

  4.     "custom_deps" : {  

  5.       # To use the trunk of a component instead of what's in DEPS:  

  6.       #"component": "https://svnserver/component/trunk/",  

  7.       # To exclude a component from your working copy:  

  8.       #"data/really_large_component": None,  

  9.     }  

  10.   },  

  11. ]  


  • name : checkout出源码的名字

  • url : 源码所在的目录,gclient希望checkout出的源码中包括一个DEPS的文件,这个文件包含了必须checkout到工作目录的源码的信息;

  • deps_file 这是一个文件名(不包括路径),指在工程目录中包含依赖列表的文件,该项为可选,默认值为"DEPS"

  • custom_deps 这是一个可选的字典对象,会覆盖工程的"DEPS"文件定义的条目。一般它用作本地目录中,那些不用checkout的代码,如

  1. "custom_deps": {  

  2.   "src/content/test/data/layout_tests/LayoutTests": None,  

  3.   "src/chrome/tools/test/reference_build/chrome_win": None,  

  4.   "src/chrome_frame/tools/test/reference_build/chrome_win": None,  

  5.   "src/chrome/tools/test/reference_build/chrome_linux": None,  

  6.   "src/chrome/tools/test/reference_build/chrome_mac": None,  

  7.   "src/third_party/hunspell_dictionaries": None,  

  8. },  


         或者让本地目录从不同位置checkout一个新的代码出来,或者checkout不同的分支、版本等。也可以用于增加在DEPS中不存在的新的项 目

  • target_os : 这个可选的条目可以指出特殊的平台,根据平台来checkout出不同代码,如

  1. target_os = ['android']  

如果target_os_only值为True的化,那么,仅仅checkout出对应的代码,如

  1. target_os = [ "ios" ]  

  2. target_os_only = True  


在每个checkout出的工程中,gclient期望发现一个DEPS文件(由deps_file来给定),它定义了工程不同部分都是如何checkout出来。

“DEPS”也是一个python脚本,最简单的,如下:

  1. deps = {  

  2.   "src/outside" : "http://outside-server/trunk@1234",  

  3.   "src/component" : "svn://svnserver/component/trunk/src@77829",  

  4.   "src/relative" : "/trunk/src@77829",  

  5. }  


deps的每个条目都包含一个key-value对,key是被checkout的本地目录,而value就是对应的远程URL。

如果路径是以'/'开头的,那么它是一个相对URL,相对与.gclient中URL地址。


URL通常包含一个版本号,以便锁定源码在特定版本上。当然,这是可选的。如果没有,那么它将获取指定分支上最新的版本。


DEPS还可以包含其他类型的数据,如vars, 

  1. vars = {  

  2.   'pymox':  

  3.     'http://pymox.googlecode.com/svn',  

  4.   'sfntly':  

  5.     'http://sfntly.googlecode.com/svn',  

  6.   'eyes-free':  

  7.     'http://eyes-free.googlecode.com/svn',  

  8.   'rlz':  

  9.     'http://rlz.googlecode.com/svn',  

  10.   'smhasher':  

  11.     'http://smhasher.googlecode.com/svn',  

  12. ...  

  13. }  


vars定义了一组变量,在后面,可以通过Var(xxx)来访问。Var(xxx)返回一个字符串,故此,也可以进行操作,如

  1.      'src/third_party/cros_dbus_cplusplus/source':  

  2.      Var("git.chromium.org") + '/chromiumos/third_party/dbus-cplusplus.git@5e8f6d9db5c2abfb91d91f751184f25bb5cd0900',  

  3.    'src/third_party/WebKit':  

  4. nbsp;     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中的写法,一般是:

  1. hooks = [  

  2.   { "pattern": "\\.(gif|jpe?g|pr0n|png)$",  

  3.     "action":  ["python", "image_indexer.py", "--all"]},  

  4.   { "pattern": ".",  

  5.     "name": "gyp",  

  6.     "action":  ["python", "src/build/gyp_chromium"]},  

  7. ]  


hooks包含一组hook,每个hook有几个重要项:

  • pattern 是一个正则表达式,用来匹配工程目录下的文件,一旦匹配成功,action项就会执行

  • action 描述一个根据特定参数运行的命令行。这个命令在每次gclient时,无论多少文件匹配,至多运行一次。这个命令和.gclient在同一目录下运行。如果第一个参数是"python",那么,当前的python解释器将被使用。如果包含字符串 "$matching_files",它将该字符串扩展为匹配出的文件列表。

  • name 可选,标记出hook所属的组,可以被用来覆盖和重新组织。

deps_os: DEPS中定义不同平台依赖关系的项目,如

  1. deps_os = {  

  2.   "win": {  

  3.     "src/chrome/tools/test/reference_build/chrome_win":  

  4.       "/trunk/deps/reference_builds/chrome_win@197743",  

  5.   

  6.     "src/third_party/cygwin":  

  7.       "/trunk/deps/third_party/cygwin@133786",  

  8.   

  9. .....  

  10.   },  

  11.   

  12.   "ios": {  

  13.     "src/third_party/GTM":  

  14.       (Var("googlecode_url") % "google-toolbox-for-mac") + "/trunk@" +  

  15.       Var("gtm_revision"),  

  16.   

  17.     "src/third_party/nss":  

  18.       "/trunk/deps/third_party/nss@" + Var("nss_revision"),  

  19. ....  

  20.    },  

  21. ...  

  22. }  

deps_os指定不同平台的依赖,它可以包含多种平台,和.gclient中的target_os对应。这种对应关系如下:

  1. DEPS_OS_CHOICES = {  

  2.   "win32": "win",  

  3.   "win": "win",  

  4.   "cygwin": "win",  

  5.   "darwin": "mac",  

  6.   "mac": "mac",  

  7.   "unix": "unix",  

  8.   "linux": "unix",  

  9.   "linux2": "unix",  

  10.   "linux3": "unix",  

  11.   "android": "android",  

  12. }  

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消