Google依赖管理DEPS


DEPS进行依赖管理在Google系统项目中大量存在,如flutter、skia、v8等。因网络的原因要想编译这些项目,还是需要了解一些DEPS相关的知识,否则遇到些问题就不知道如何处理了。

一、DEPS结构

DEPS文件主要包含以下3部分内容

  • 源码所有仓库地址及commitId
  • 工具的下载地址
  • 要执行的脚本

DEPS文件的配置主要分为两项,一个是deps项,源码及工具都在deps配置下;另一个是hooks项,要执行的脚本都在hooks下配置。

deps

deps配置为键值对,key为目标存放路径,value为目标的下载地址,源码项为git仓库地址及所在commitId;工具则存储在数据仓库CIPD、GoogleStore等。

deps = {
  'src': 'https://github.com/flutter/buildroot.git' + '@' + '8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688',

  'src/third_party/harfbuzz': Var('flutter_git') + '/third_party/harfbuzz' + '@' + 'd40d15e994ed60d32bcfc9ab87004dfb028dfbd6',
   
  'src/third_party/glfw': Var('fuchsia_git') + '/third_party/glfw' + '@' + '78e6a0063d27ed44c2c4805606309744f6fb29fc',

  'src/buildtools/windows-x64/clang': {
    'packages': [
      {
        'package': 'fuchsia/third_party/clang/windows-amd64',
        'version': Var('clang_version'),
      }
    ],
    'condition': 'download_windows_deps',
    'dep_type': 'cipd',
  }
}

hooks

即源码及工具下载完成后要执行的脚本。name字段为脚本名称,即让他人明白脚本是要做什么的;action为要执行的脚本命令。

hooks = [
  {
    # Generate the Dart SDK's .dart_tool/package_confg.json file.
    'name': 'Generate .dart_tool/package_confg.json',
    'pattern': '.',
    'action': ['python3', 'src/third_party/dart/tools/generate_package_config.py'],
  },
  {
    # Generate the sdk/version file.
    'name': 'Generate sdk/version',
    'pattern': '.',
    'action': ['python3', 'src/third_party/dart/tools/generate_sdk_version_file.py'],
  }
]

二、DEPS解析产物

.执行gclient sync命令会对DEPS文件进行解析,生成gclient_entries文件,此文件为各依赖项解析后的下载地址。依赖被存储在git仓库或文件仓库中,文件仓库有两种一是CIPD、另一个是GoogleStorage

entries = {
  'src/flutter': 'https://github.com/flutter/engine.git@800594f1f4a6674010a6f1603c07a919b4d7ebd7',
  'src': 'https://github.com/flutter/buildroot.git@8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688',
  'src/buildtools/windows-x64/clang:fuchsia/third_party/clang/windows-amd64': 'https://chrome-infra-packages.appspot.com/fuchsia/third_party/clang/windows-amd64@git_revision:a93d03310e2c02fa5e24544df4706650f85788f7',
  'src/flutter/prebuilts/windows-arm64/dart-sdk:flutter/dart-sdk/windows-arm64': 'https://chrome-infra-packages.appspot.com/flutter/dart-sdk/windows-arm64@git_revision:6fb1982e93c3da7b5458db9838a6fd67d379c329',
  'src/flutter/prebuilts/windows-x64/dart-sdk:flutter/dart-sdk/windows-amd64': 'https://chrome-infra-packages.appspot.com/flutter/dart-sdk/windows-amd64@git_revision:6fb1982e93c3da7b5458db9838a6fd67d379c329',
  'src/flutter/third_party/gn:gn/gn/${platform}': 'https://chrome-infra-packages.appspot.com/gn/gn/${platform}@git_revision:b79031308cc878488202beb99883ec1f2efd9a6d',
  'src/flutter/third_party/ninja:infra/3pp/tools/ninja/${platform}': 'https://chrome-infra-packages.appspot.com/infra/3pp/tools/ninja/${platform}@version:2@1.8.2.chromium.3',
  'src/third_party/abseil-cpp': 'https://flutter.googlesource.com/third_party/abseil-cpp.git@61833f2c057a2b1993d871e8c51156aed1dd4354',
  'src/third_party/android_tools/google-java-format:flutter/android/google-java-format': 'https://chrome-infra-packages.appspot.com/flutter/android/google-java-format@version:1.7-1',
  'src/third_party/angle': 'https://chromium.googlesource.com/angle/angle.git@094b49db60cb48ee932a875898b57accbfa656de'
}

.gclient_entries文件中在${platform}变量,此变量根据系统信息进行赋值,platform值有以下几种:

  • windows-amd64
  • windows-arm64
  • linux-amd64
  • linux-arm64
  • macos-amd64
  • macos-arm64

1、GIT

即项目及依赖所在的git仓库信息

deps = {
  'src': 'https://github.com/flutter/buildroot.git' + '@' + '8747bce41d0dc6d9dc45c4d1b46d2100bb9ee688',
  'src/third_party/harfbuzz': Var('flutter_git') + '/third_party/harfbuzz' + '@' + 'd40d15e994ed60d32bcfc9ab87004dfb028dfbd6'
}

2、CIPD(Chrome Infrastructure Package Deployment)

仓库地址:https://chrome-infra-packages.appspot.com/

CIPD(Chrome Infrastructure Package Deployment),此仓库存储的是二进制文件,如工具、压缩包等,而非源码。

deps = {
  'src/flutter/prebuilts/windows-x64/dart-sdk': {
    'packages': [
      {
        'package': 'flutter/dart-sdk/windows-amd64',
        'version': 'git_revision:'+Var('dart_revision')
      }
    ],
    'dep_type': 'cipd',
    'condition': 'host_os == "win" and download_dart_sdk'
  },
  
  'src/flutter/third_party/gn': {
    'packages': [
      {
        'package': 'gn/gn/${{platform}}',
        'version': 'git_revision:b79031308cc878488202beb99883ec1f2efd9a6d'
      },
    ],
    'dep_type': 'cipd',
  },
}

下载地址错误问题

因网络、环境等因素此类型的依赖可能不能被正常下载。如,在.gclient_entries文件中生成的下载路径不能被正常访问,
.gclient_entries路径:
https://chrome-infra-packages.appspot.com/fuchsia/third_party/clang/windows-amd64@git_revision:a93d03310e2c02fa5e24544df4706650f85788f7

正确路径:
https://chrome-infra-packages.appspot.com/p/fuchsia/third_party/clang/windows-amd64/+/git_revision:a93d03310e2c02fa5e24544df4706650f85788f7

地址修复流程

针对.gclient_entries文件中生成的链接,可做如下修改即可

1、 在域名后加上p/路径

# 修改前
https://chrome-infra-packages.appspot.com/fuchsia/
# 修改后
https://chrome-infra-packages.appspot.com/p/fuchsia/

2、将@替换成/+/

# 修改前
amd64@git_revision
# 修改后
amd64/+/git_revision

3、将${platfrom}占位符换成对应的平台字符串,如windows-amd64、linux-amd64、mac-amd64等

# 修改前
infra/3pp/tools/ninja/${platform}
# 修改后
infra/3pp/tools/ninja/windows-amd64

3、GoogleStorage

此类型配置依赖DEPS文件中的配置信息,及本地的.sha1文件中的sha1值,执行download_from_google_storage脚本从指定bucket下载指定平台压缩包文件。download_from_google_storage脚本位于depot_tools工具目录下,初次执行此脚本会下载当前平台使用的gsutil_xxx.zip文件,如果不能正常下载,可修改python脚本,打日志看一下错误信息。

  {
    'name': '7zip',
    'pattern': '.',
    'condition': 'download_windows_deps',
    'action': [
      'download_from_google_storage',
      '--no_auth',
      '--no_resume',
      '--bucket',
      'dart-dependencies',
      '--platform=win32',
      '--extract',
      '-s',
      'src/third_party/dart/third_party/7zip.tar.gz.sha1',
    ],
  }

三、DEPS工具

gclient

下载

Linux/Mac端直接使用git下载即可

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

windows端直接从此页找到下载地址进行下载。
在这里插入图片描述

使用

deps使用特别简单,只需在.gclient文件配置好要下载的仓库信息,执行gclient sync下载即可。

1、配置.gclient文件
.gclient文件可手动创建也可以通过gclient config进行配置,建议直接使用config命令创建,否则还需要记住.gclient文件内容。

# 配置flutter仓库地址,同时指明要clone的commitId
gclient config https://github.com/flutter/engine.git@800594f1f4a6674010a6f1603c07a919b4d7ebd7

.gclient文件内容如下

solutions = [
  { "name"        : 'src/flutter',
    "url"         : 'https://github.com/flutter/engine.git@800594f1f4a6674010a6f1603c07a919b4d7ebd7',
    "deps_file"   : 'DEPS',
    "managed"     : False,
    "custom_deps" : {
    },
    "custom_vars": {},
  },
]

2、执行下载
在.gclient文件所在目录执行gclient sync即可触发依赖下载。

gclient sync

四、DEPS下载流程

1、解析DEPS文件,生成.gclient_entries文件。
2、根据.gclient_entries文件下载文件到指定目录。
3、执行DEPS文件中的hooks脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值