RubyGems 导航菜单
指南

用于 Bundler 依赖项解析的紧凑索引 API 的详细信息

紧凑索引 API

紧凑索引 API 被认为是稳定的公共 API。

主要索引文件是 versions 文件,它提供每个 rubygem info 文件的名称、版本和 MD5 校验和。

如果您需要收集所有 rubygem 的所有信息,请使用 rubygems.org 数据库的公共数据转储

获取和缓存

示例响应(忽略了一些标题)

$ curl -I https://rubygems.org.cn/info/bundler

HTTP/2 200
last-modified: Fri, 22 Mar 2024 13:09:59 GMT
etag: "40148273a7c7cd16b49d00a9935fd445"
cache-control: max-age=60, public
content-type: text/plain; charset=utf-8
repr-digest: sha-256="pf7Ts7NTRac//JxO9ke3IYbcWx8kcVn9N0mbm5EJpP0="
accept-ranges: bytes

所有紧凑索引端点都支持带有 If-None-Match 标头的 ETags。

If-None-Match: "40148273a7c7cd16b49d00a9935fd445"

紧凑索引旨在使用 HTTP Range 标头获取。当存在先前获取的副本时,可以使用范围请求来利用附加的行模式。

Range: bytes=#{range_start}-

来自 /versions/info/[GEM] 端点的响应将包含 Repr-Digest 头部。无论响应包含完整文件还是部分响应,摘要都将至少包含整个文件的 SHA256 校验和。请注意,Digest 头部存在,但已弃用,可能会在不通知的情况下删除。

当满足 Range 头部时,将内容精确地追加到起始字节处,然后计算结果文件的 SHA256 校验和。如果结果与 Repr-Digest 头部的 SHA256 校验和匹配,则该文件被认为完整且最新。

/versions 文件中的每一行都包含在写入该行时,该 rubygem 对应的 /info 文件的最新 MD5 计算结果。最新的 MD5(最接近文件末尾)将与最新的 /info 文件的 MD5 相匹配。

确切的实现细节可以在 Bundler CompactIndexClient::Updater 中找到。

GET - /versions

返回一个基于自定义文本的格式,其中包含有关所有 rubygem 的所有版本的信息。

此 API 端点旨在成为所有可能 rubygem 版本的紧凑索引。当添加新的 rubygem 或 rubygem 版本,或当某个 rubygem 被撤回时,它将使用下面详细说明的格式添加到文件末尾。

该文件仅在当月追加,这提高了缓存性能。它在每个月的开始重新计算,删除被撤回的 rubygem 并将新版本压缩成每个 rubygem 的一行。

警告:这是一个大文件。示例已截断。

$ curl https://rubygems.org.cn/versions

created_at: 2024-04-01T00:00:05Z
---
- 1 05d0116933ba44b0b5d0ee19bfd35ccc
-A 0.0.0 8b1527991f0022e46140907a7fc4cfd4
.cat 0.0.1 631fd60a806eaf5026c86fff3155c289
.omghi 1,2 7a67c0434100c2ab635b9f4865ee86bd
0mq 0.1.0,0.1.1,0.1.2,0.2.0,0.2.1,0.3.0,0.4.0,0.4.1,0.5.0,0.5.1,0.5.2,0.5.3 6146193f8f7e944156b0b42ec37bad3e
[...SNIP...]
active_model_serializers -0.9.10 7ad37af4aec8cc089e409e1fdec86f3d
active_model_serializers 0.9.11 a6d40e97b289ee6c806e5e9f7031623b
openapi_first 1.4.1 40fbfdebcbfee3863df697e1d641f637

versions 文件格式

versions 文件的格式在计算时使用每 rubygem 一行,在末尾追加额外的行,其中可能包含已在文件前面存在的 rubygem 的新版本或被撤回的版本。

--- 之前的行应被视为不透明的元数据。

created_at: 2024-04-01T00:00:05Z
--- 

以下每一行都提供有关 1 个 rubygem 的信息,格式如下

RUBYGEM [-]VERSION_PLATFORM[,VERSION_PLATFORM],...] MD5

该行的各个部分如下

  1. RUBYGEM - rubygem 的名称。
  2. (SPACE) - 空格字符。
  3. [(MINUS)] - (可选)-(减号)字符。仅当后面的版本自上次重新计算 versions 文件以来已被撤回时才存在。
  4. VERSION_PLATFORM - 一个 rubygem 版本,可能包含平台。此组合格式在 info 文件格式部分中进行了更详细的描述。
  5. [(COMMA)VERSION] - (可选),(逗号)字符,表示后面将跟随另一个版本。读取以逗号分隔的版本块,直到遇到空格。
  6. (SPACE) - 空格字符。
  7. MD5 - rubygem “info” 文件的 MD5,如下所述。在 versions 文件中,只有宝石名称的最后一个 MD5 应被视为与相关 info 文件准确匹配。

有关更多详细信息,请参阅 Bundler 中的解析器

GET - /info/<RUBYGEM>

返回一个基于文本的自定义格式,用于表示名为 <RUBYGEM> 的单个 rubygem,每行表示一个版本。

示例已截断。

$ curl https://rubygems.org.cn/info/rails

---
2.2.2 actionmailer:= 2.2.2,actionpack:= 2.2.2,activerecord:= 2.2.2,activeresource:= 2.2.2,activesupport:= 2.2.2,rake:>= 0.8.3|checksum:84fd0ee92f92088cff81d1a4bcb61306bd4b7440b8634d7ac3d1396571a2133f
2.3.2 actionmailer:= 2.3.2,actionpack:= 2.3.2,activerecord:= 2.3.2,activeresource:= 2.3.2,activesupport:= 2.3.2,rake:>= 0.8.3|checksum:ac61e0356987df34dbbafb803b98f153a663d3878a31f1db7333b7cd987fd044
2.0.5 actionmailer:= 2.0.5,actionpack:= 2.0.5,activerecord:= 2.0.5,activeresource:= 2.0.5,activesupport:= 2.0.5,rake:>= 0.7.2|checksum:5e8a6e36f2537b795b7bb237e2aea18a166349e1e54e463a64beba5ae84cd406
[...SNIP...]
7.0.8.1 actioncable:= 7.0.8.1,actionmailbox:= 7.0.8.1,actionmailer:= 7.0.8.1,actionpack:= 7.0.8.1,actiontext:= 7.0.8.1,actionview:= 7.0.8.1,activejob:= 7.0.8.1,activemodel:= 7.0.8.1,activerecord:= 7.0.8.1,activestorage:= 7.0.8.1,activesupport:= 7.0.8.1,bundler:>= 1.15.0,railties:= 7.0.8.1|checksum:7deb37884ac5e9afeaeb6ad503c56e819f68e53746d621b2187322f874ba2ded,ruby:>= 2.7.0,rubygems:>= 1.8.11
7.1.3.1 actioncable:= 7.1.3.1,actionmailbox:= 7.1.3.1,actionmailer:= 7.1.3.1,actionpack:= 7.1.3.1,actiontext:= 7.1.3.1,actionview:= 7.1.3.1,activejob:= 7.1.3.1,activemodel:= 7.1.3.1,activerecord:= 7.1.3.1,activestorage:= 7.1.3.1,activesupport:= 7.1.3.1,bundler:>= 1.15.0,railties:= 7.1.3.1|checksum:73aa0775e7dc698cebad542de2eea6d5b62957290e6a23a96e915281df36f026,ruby:>= 2.7.0,rubygems:>= 1.8.11
7.1.3.2 actioncable:= 7.1.3.2,actionmailbox:= 7.1.3.2,actionmailer:= 7.1.3.2,actionpack:= 7.1.3.2,actiontext:= 7.1.3.2,actionview:= 7.1.3.2,activejob:= 7.1.3.2,activemodel:= 7.1.3.2,activerecord:= 7.1.3.2,activestorage:= 7.1.3.2,activesupport:= 7.1.3.2,bundler:>= 1.15.0,railties:= 7.1.3.2|checksum:2d787a65e87b70ee65f9d1cb644aaa5bb80eea12298982f474da949772c1bfa0,ruby:>= 2.7.0,rubygems:>= 1.8.11

info 文件格式

info 文件的格式使用每行一个版本。当添加新版本时,会在文件末尾追加额外的行。

当一个版本被撤回时,info 文件会被重新计算。该文件永远不会列出被撤回的版本,只会将其从文件中排除。

任何在 --- 之前的行都应被视为不透明的。

---

每行之后都包含有关 rubygem 的一个版本的信息,格式如下:

VERSION[-PLATFORM] [DEPENDENCY[,DEPENDENCY,...]]|REQUIREMENT[,REQUIREMENT,...]

每行的部分如下:

  1. VERSION - rubygem 的版本。读取 VERSION 直到遇到 -(减号)或空格字符。
  2. [-PLATFORM] - 平台,如果它不是默认平台 ruby。在 VERSION[-PLATFORM] 块中的第一个 -(减号)字符将 VERSION 和 PLATFORM 分开。PLATFORM 可能包含多个连字符。读取平台直到遇到空格。
  3. (SPACE) - 空格字符。
  4. [DEPENDENCY] - (可选)依赖项是另一个此 gem 所需的 rubygem。DEPENDENCY 可能包含空格。有关格式,请参见下文。
  5. [(COMMA)DEPENDENCY] - (可选)一个 ,(逗号)字符,表示另一个 DEPENDENCY 将紧随其后。读取逗号分隔的 DEPENCENCY 块,直到遇到 |(管道)字符。
  6. (PIPE) - |(管道)字符。
  7. REQUIREMENT - rubygem 的其他要求,其中始终包含至少一个 SHA256 校验和。REQUIREMENT 可能包含空格。有关格式,请参见下文。
  8. [(COMMA)REQUIREMENT] - (可选)一个 ,(逗号)字符,表示另一个 REQUIREMENT 将紧随其后。读取逗号分隔的 REQUIREMENT 块,直到行尾。

DEPENCENCY 格式

示例

actionmailer:= 2.2.2
parser:>= 3.2.2.3
rainbow:< 4.0
unicode-display_width:< 3.0&>= 2.4.0
rack:~> 1.0
tilt:!= 1.3.0&~> 1.1

格式

GEM:CONSTRAINT[&CONSTRAINT]
  1. RUBYGEM - 依赖的 rubygem。
  2. (COLON) - : (冒号) 字符。
  3. CONSRAINT - 版本约束。一个 [=, >, <, >=, <=, ~>, !=] 中的 OPERATOR,然后是一个(可选的)空格字符,然后是一个 VERSION。
  4. [(AMPERSAND)CONSTRAINT] - 一个 & (与) 字符,表示后面跟着一个与同一个 GEM 相关的附加 CONSTRAINT。读取以与分隔的 CONSTRAINT 块,直到遇到 , (逗号) 字符。

REQUIREMENT 格式

REQUIREMENT 块将始终包含 checksum 键。 rubyrubygems 键类似于上面的 CONSTRAINT,表示所需的 ruby 或 rubygems 版本。

checksum 是最初上传到 rubygems.org 的 GEM-VERSION-PLATFORM.gem 文件的 SHA256 校验和。从匹配的下载的 .gem 文件计算的 SHA256 必须与该校验和匹配,否则 .gem 必须被认为已损坏。

示例

checksum:2c4af8d4a65ac5290445bfe7582be4490162d6934f49d76858b55647b4c4428d
ruby:< 3.3.dev&>= 2.7
rubygems:>= 1.8.11

格式

KEY:VALUE
  1. KEY - 一个字母数字键。
  2. (COLON) - 一个 : (冒号) 字符。
  3. VALUE - 键的值。VALUE 必须不包含 , (逗号) 或 : (冒号) 字符。

GET - /names

返回所有 rubygem 名称的自定义文本格式,每行一个 rubygem 名称。

该 API 目前没有被任何官方的 rubygems 工具使用。顺序可能会发生变化。示例已截断。

$ curl https://rubygems.org.cn/names

---
_
-
0mq
0xdm5
[...SNIP...]

names 文件格式

names 文件的格式是一个简单的换行符分隔的 rubygem 名称列表。

任何在 --- 之前的行都应被视为不透明的。

---

每行只包含一个 rubygem 名称

RUBYGEM

该行的各个部分如下

  1. RUBYGEM - rubygem 的名称。