文章目录
- 前言
- 开发环境
- 问题描述
- 问题分析
- 解决方案
- 最后
前言
在研究将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项目,每一个提交就是一个版本。找到历史提交记录:
看到刚提交不久的记录增加了新的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
环境变量未定义时出现报错。关于禁用自动更新官方文档也有说明:
搞清楚了怎么禁止自动更新,接下来就是设置环境变量。在~/.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
命令,问题重现了!
解决方案
在问题修复之前,可以按以下步骤操作暂时解决这个问题:
- 禁用自动更新
在~/.bashrc
或~/.zshrc
文件中加上:
export DEPOT_TOOLS_UPDATE=0
当然,你也可以直接在命令行窗口中输入export DEPOT_TOOLS_UPDATE=0
设置临时的环境变量。设置后可以通过printenv
命令查看环境变量是否设置成功。
- 指定
depot_tools
版本
在depot_tools
项目根目录路径下执行:
git checkout d0b85e47dc0a142bb7f2c3c40f5c4956e6f87227
- 继续执行原先的
fetch/gclient
等命令
最后
如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~