depot_tools问题记录 - 执行fetch/gclient命令无响应

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
  • 解决方案
  • 最后


前言

在研究将Dart dill文件序列化为可读文本时遇到的问题。

开发环境

  • macOS: 13.4

问题描述

之前使用depot_tools中的fetch/gclient命令还是正常的,今天想实测--no-history参数时突然遇到命令无响应的情况。

fetch命令在终端中无响应无任何输出,gclient命令在终端中输出Updating depot_tools...后也无响应。

问题分析

首先想到会不会是网络问题,检查一番发现网络是正常的,代理什么的也是正常的,而且如果是网络问题应该会有网络链接超时之类的报错。

尝试重新获取depot_tools

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

获取成功没报错,再次执行fetch/gclient命令,发现有下载东西,对比前后大小差了大概600MB。对比文件主要是增加一些可执行文件,特别是新增的.cipd_bin目录,有400多MB大小,不过应该是正常的。

折腾了一番没什么头绪,不过执行fetch --no-history dart命令时提前终止后输出了一个错误:

failed to install infra/tools/luci/vpython/mac-arm64: context canceled

咦?这个错误虽然不确定是否和当前问题有关系,但是看到vpython我想到fetch/gclient命令本质都是python脚本,会不会问题出在python脚本的执行呢?暂时不好做出判断,仔细想了想昨天和今天的操作真没什么区别,等等,depot_tools的版本好像变了,每次执行fetch/gclient命令会自动更新depot_tools

depot_tools没有明确的发行版本,本质是Git项目,每一个提交就是一个版本。找到历史提交记录:

depot_tools问题记录 - 执行fetch/gclient命令无响应_第1张图片

看到刚提交不久的记录增加了新的vpython,结合前面的猜测,严重怀疑问题就是这个提交导致的,新的vpython导致python脚本执行不正常,接下来就是验证怀疑。

depot_tools切换到可能有问题版本的上一个版本,在depot_tools项目根目录路径下执行:

git checkout d0b85e47dc0a142bb7f2c3c40f5c4956e6f87227

再次执行fetch/gclient命令,结果还是先自动更新到最新版本,看来得先禁止自动更新。

Updating depot_tools...当作关键词搜索可以快速定位自动更新调用的是depot_tools中的update_depot_tools,这个本质是一个shell脚本,所以可以用文本工具打开。关键部分:

# Update git checkouts.
if [ "X$DEPOT_TOOLS_UPDATE" != "X0" ]; then
  echo "Updating depot_tools..." 1>&2
  if [ -e "$base_dir/.git" ]; then
    cd "$base_dir"
    update_git_repo
    UPDATE_RESULT=$?
    cd - > /dev/null
    if [[ $UPDATE_RESULT -ne 0 ]]; then
      exit $UPDATE_RESULT
    fi
  else
    echo "Warning: Your depot_tools directory does not appear to be a git repository, and cannot be updated." 1>&2
    echo "Consider deleting your depot_tools directory and following the instructions at https://www.chromium.org/developers/how-tos/install-depot-tools/ to reinstall it." 1>&2
  fi
  ...
fi

从源码可知,当环境变量DEPOT_TOOLS_UPDATE等于0时将不会继续往下执行更新操作,至于X$DEPOT_TOOLS_UPDATE中拼接X的作用是避免当DEPOT_TOOLS_UPDATE环境变量未定义时出现报错。关于禁用自动更新官方文档也有说明:

depot_tools问题记录 - 执行fetch/gclient命令无响应_第2张图片

搞清楚了怎么禁止自动更新,接下来就是设置环境变量。在~/.bashrc~/.zshrc文件中加上:

export DEPOT_TOOLS_UPDATE=0

当然,你也可以直接在命令行窗口中输入export DEPOT_TOOLS_UPDATE=0设置临时的环境变量。设置后可以通过printenv命令查看环境变量是否设置成功。

将版本重新切换为d0b85e47dc0a142bb7f2c3c40f5c4956e6f87227,再次执行fetch --no-history dart命令,没有自动更新,一切正常。

那一定是那个版本的问题吗?将版本切换为怀疑有问题的版本:

git checkout ae21f6a5ec30b63e4b8405fc5a783eb242ef10c5

再次执行fetch --no-history dart命令,问题重现了!

解决方案

在问题修复之前,可以按以下步骤操作暂时解决这个问题:

  1. 禁用自动更新

~/.bashrc~/.zshrc文件中加上:

export DEPOT_TOOLS_UPDATE=0

当然,你也可以直接在命令行窗口中输入export DEPOT_TOOLS_UPDATE=0设置临时的环境变量。设置后可以通过printenv命令查看环境变量是否设置成功。

  1. 指定depot_tools版本

depot_tools项目根目录路径下执行:

git checkout d0b85e47dc0a142bb7f2c3c40f5c4956e6f87227
  1. 继续执行原先的fetch/gclient等命令

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞加星,谢谢~

你可能感兴趣的:(问题记录,depot_tools)