用于 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
该行的各个部分如下
RUBYGEM
- rubygem 的名称。(SPACE)
- 空格字符。[(MINUS)]
- (可选)-
(减号)字符。仅当后面的版本自上次重新计算versions
文件以来已被撤回时才存在。VERSION_PLATFORM
- 一个 rubygem 版本,可能包含平台。此组合格式在info
文件格式部分中进行了更详细的描述。[(COMMA)VERSION]
- (可选),
(逗号)字符,表示后面将跟随另一个版本。读取以逗号分隔的版本块,直到遇到空格。(SPACE)
- 空格字符。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,...]
每行的部分如下:
VERSION
- rubygem 的版本。读取 VERSION 直到遇到-
(减号)或空格字符。[-PLATFORM]
- 平台,如果它不是默认平台ruby
。在VERSION[-PLATFORM]
块中的第一个-
(减号)字符将 VERSION 和 PLATFORM 分开。PLATFORM 可能包含多个连字符。读取平台直到遇到空格。(SPACE)
- 空格字符。[DEPENDENCY]
- (可选)依赖项是另一个此 gem 所需的 rubygem。DEPENDENCY 可能包含空格。有关格式,请参见下文。[(COMMA)DEPENDENCY]
- (可选)一个,
(逗号)字符,表示另一个 DEPENDENCY 将紧随其后。读取逗号分隔的 DEPENCENCY 块,直到遇到|
(管道)字符。(PIPE)
-|
(管道)字符。REQUIREMENT
- rubygem 的其他要求,其中始终包含至少一个 SHA256 校验和。REQUIREMENT 可能包含空格。有关格式,请参见下文。[(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]
RUBYGEM
- 依赖的 rubygem。(COLON)
-:
(冒号) 字符。CONSRAINT
- 版本约束。一个[=, >, <, >=, <=, ~>, !=]
中的 OPERATOR,然后是一个(可选的)空格字符,然后是一个 VERSION。[(AMPERSAND)CONSTRAINT]
- 一个&
(与) 字符,表示后面跟着一个与同一个 GEM 相关的附加 CONSTRAINT。读取以与分隔的 CONSTRAINT 块,直到遇到,
(逗号) 字符。
REQUIREMENT
格式
REQUIREMENT 块将始终包含 checksum
键。 ruby
和 rubygems
键类似于上面的 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
KEY
- 一个字母数字键。(COLON)
- 一个:
(冒号) 字符。VALUE
- 键的值。VALUE 必须不包含,
(逗号) 或:
(冒号) 字符。
GET - /names
返回所有 rubygem 名称的自定义文本格式,每行一个 rubygem 名称。
该 API 目前没有被任何官方的 rubygems 工具使用。顺序可能会发生变化。示例已截断。
$ curl https://rubygems.org.cn/names
---
_
-
0mq
0xdm5
[...SNIP...]
names
文件格式
names
文件的格式是一个简单的换行符分隔的 rubygem 名称列表。
任何在 ---
之前的行都应被视为不透明的。
---
每行只包含一个 rubygem 名称
RUBYGEM
该行的各个部分如下
RUBYGEM
- rubygem 的名称。