因为淘宝 gems 镜像只是简单的 mirror 了上游的 gems 包 (使用工具 rubygems-mirror), 上传到阿里云 oss 之后再用 nginx 做前端做了一个 302 重定向实现的。
因为本地没有任何应用跑着,所以 api 请求在本地肯定是无法服务了,之前 @huacnlee 的解决方案是给 api 请求加了一个 proxy 到 https://rubygems.org
从我个人的使用感受上来说,加了这个 proxy 后 gems 的安装速度反而变慢了,因为从中国去 rubygems 的线路确实不好,就算在阿里的机房也没有明显优势。
代理 api 请求之后在 gem install
的时候就会精确的获得 gems 的依赖关系,通过少量的 API 请求 来生成依赖图,然后下载对应的包
api 请求 404 之后就会转而去下载 specs.4.8.gz 文件,拿到完整的 gem specs 列表,然后再去请求每个被安装 gems 的所有版本的 gemspec 文件
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.1.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.1-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.1-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.2.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.2.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.2-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.2-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.3.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.3.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.3-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.3-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.2.0.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.2.0.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.2.0-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.2.0-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.3.1.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.3.1.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.3.1-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.3.1-java.gemspec.rz
其实就是征集下反馈:
注:现在 API 是 Proxy 的,即每次请求都会在后端请求到 https://rubygems.org