在按官方文档使用 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
其他步骤同上。