• 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

  • 相关阅读:
    Azure HPC Pack Cluster添加辅助节点
    Azure HPC Pack 辅助节点模板配置
    Azure HPC Pack配置管理系列(PART6)
    Windows HPC Pack 2012 R2配置
    Azure HPC Pack 节点提升成域控制器
    Azure HPC Pack VM 节点创建和配置
    Azure HPC Pack 部署必要条件准备
    Azure HPC Pack 基础拓扑概述
    Azure VM 性能计数器配置
    Maven私仓配置
  • 原文地址:https://www.cnblogs.com/bigben0123/p/13050170.html
Copyright © 2020-2023  润新知