C++

使用代理同步谷歌项目时出现文件下载失败

Posted on June 7, 2016

在按官方文档使用 gclient sync 命令同步谷歌v8或Chromium项目时,最后总是会出现文件下载失败的报错:

Failed to fetch file gs://chromium-gn/a68b194afb05d6a6357cf2e2464136ed7723c305 for src/buildtools/mac/gn.
...
Error: Command 'download_from_google_storage --no_resume --platform=darwin --no_auth --bucket chromium-gn -s src/buildtools/mac/gn.sha1' returned non-zero exit status ...

搜索了一下午才找到解决方案,是翻墙代理的问题, gclient sync 里的某些子命令似乎在代理环境下无法正确连接谷歌服务器,准确说是连接上了,但是验证会卡非常长时间然后验证失败无法下载。一开始以为是代理没配置好,专门给命令行也配置了代理依然不行。这个问题如果你上谷歌官方issue和论坛里去找几乎找不到正确解决方案,因为他们大部分人不需要翻墙,在天朝写个代码真不容易。

这个问题不知道谷歌会不会修好,如果一直没修自己手动也可以解决。本质上只是谷歌自己的命令行工具无法下载,但是你通过浏览器或者其他命令行工具是能下载文件的。以上面的报错为例,命令行需要把这个文件:

gs://chromium-gn/a68b194afb05d6a6357cf2e2464136ed7723c305

下载到这里并命名为 gn

src/buildtools/mac/gn

我们只需要 gs:// 替换为 https://storage.googleapis.com/ 就可以直接在浏览器下载了。前提当然是你还开着翻墙代理。所以任务就变成了下载下面这个地址的文件到刚刚那个目录。

https://storage.googleapis.com/chromium-gn/a68b194afb05d6a6357cf2e2464136ed7723c305

你可以一个个用浏览器下载,也可以用命令行工具如 wget 去下载:

wget --no-check-certificate https://storage.googleapis.com/chromium-gn/a68b194afb05d6a6357cf2e2464136ed7723c305 -O src/buildtools/mac/gn

可以写个工具脚本,一旦遇到 download_from_google_storage 错误的时候就执行一次手动下载,直到再次执行 gclient sync 不再报错为止,问题就解决了。

「更新」

我花了点时间用 NodeJS 写了个全自动下载的命令行工具。点击此处下载:gs.zip。下载后要在系统安装一下 NodeJS 就可以用了。使用方式很简单,如果在mac下,下载这个文件解压后,放到你上次执行 gclient sync 的那个目录下,也就是v8或src(chromium)文件夹的上一级。先执行一下:

chmod +x ./gs

让它有可执行权限。然后直接执行:

./gs src/DEPS

只有一个参数,输入项目中DEPS这个文件的路径给它。不管相对路径还是绝对路径都可以。然后你就应该会看到一系列如下的输出:

downloading... https://xxx  to  xxx

等它全部下载完就好了。然后你再继续执行 gclient sync 应该就没问题了。 如果在windows下,把那个gs加个 .js 的扩展名,然后用 node 命令执行它即可,类似这样:

node gs.js src/DEPS

其他步骤同上。