用於 Bundler 相依性解析的精簡索引 API 詳細資料
精簡索引 API
精簡索引 API 被視為穩定的公開 API。
主要索引檔案是 versions
檔案,其中提供每個 rubygem info
檔案的名稱、版本和 MD5 校驗和。
如果您需要收集所有 rubygem 的所有資訊,請使用 rubygems.org 資料庫的 公開資料轉儲。
擷取和快取
範例回應(忽略一些標頭)
$ curl -I https://rubygems.org/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
標頭的 ETag。
If-None-Match: "40148273a7c7cd16b49d00a9935fd445"
精簡索引的設計是使用 HTTP Range
標頭擷取。當存在先前擷取的副本時,範圍要求會利用附加行模式。
Range: bytes=#{range_start}-
來自 /versions
和 /info/[GEM]
端點的回應將包含 Repr-Digest
標頭。摘要至少會包含整個檔案的 SHA256 檢查碼,無論回應包含完整檔案或部分回應。請注意,Digest
標頭存在,但已棄用,可能會在未通知的情況下移除。
當範圍標頭滿足時,請在起始位元組處附加內容,然後計算結果檔案的 SHA256 檢查碼。如果結果與 Repr-Digest
標頭的 SHA256 檢查碼相符,則檔案會被視為完整且最新。
/versions
檔案中的每一行都包含在撰寫該行時,對應 /info
檔案的最新 MD5 計算。檔案末尾最接近的最新 MD5,將與最新 /info
檔案的 MD5 相符。
可以在 Bundler CompactIndexClient::Updater 中找到確切的實作詳細資訊。
GET - /versions
傳回包含所有 RubyGem 所有版本的資訊的客製化文字格式。
此 API 端點旨在成為所有可能的 RubyGem 版本的精簡索引。當新增 RubyGem 或 RubyGem 版本,或當 RubyGem 被取消時,它會使用下方詳細說明的格式,新增到檔案的結尾。
檔案只會在該月份附加,這會改善快取效能。它會在每個月的開始重新計算,移除已取消的 RubyGem,並將新版本壓縮成每個 RubyGem 的一行。
警告:這是一個大檔案。範例已截斷。
$ curl https://rubygems.org/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 VERSION,可能包含 PLATFORM。此組合格式在info
檔案格式部分中有更詳細的說明。[(COMMA)VERSION]
- (選用),
(逗號) 字元,表示後面還會有另一個 VERSION。讀取逗號分隔的 VERSION 塊,直到遇到空白為止。(SPACE)
- 空白字元。MD5
- rubygem「info」檔案的 MD5,如下所述。在versions
檔案中,gem 名稱的最後一個 MD5 才應視為相關 info 檔案的正確 MD5。
如需更多詳細資訊,請參閱 Bundler 中的剖析器。
GET - /info/<RUBYGEM>
傳回 <RUBYGEM>
所指定的單一 rubygem 的自訂文字格式,rubygem 的每個版本各一行。
範例已截斷。
$ curl https://rubygems.org/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 1 個版本的資訊,格式如下
VERSION[-PLATFORM] [DEPENDENCY[,DEPENDENCY,...]]|REQUIREMENT[,REQUIREMENT,...]
每一行的各個部分如下
VERSION
- rubygem 的版本。讀取 VERSION,直到遇到-
(減號) 或空白字元為止。[-PLATFORM]
- 如果不是預設平台ruby
,則為平台。在VERSION[-PLATFORM]
塊中的第一個-
(減號) 字元會將 VERSION 和 PLATFORM 分開。PLATFORM 可能包含更多連字符。讀取平台,直到遇到空白為止。(SPACE)
- 空白字元。[DEPENDENCY]
- (選用) 相依性是此 gem 所需要的另一個 rubygem。DEPENDENCY 可能包含空白。格式請參閱下方。[(逗號)依賴關係]
- (選用) 一個,
(逗號) 字元,表示另一個 DEPENDENCY 將會接續。讀取逗號分隔的 DEPENDENCY 塊,直到遇到|
(直線) 字元。(直線)
-|
(直線) 字元。需求
- rubygem 的其他需求,其中總是至少包含 SHA256 校驗和。需求可能包含空格。請參閱下方格式。[(逗號)需求]
- (選用) 一個,
(逗號) 字元,表示另一個需求將會接續。讀取逗號分隔的需求塊,直到行尾。
依賴關係
格式
範例
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。(冒號)
-:
(冒號) 字元。約束
- 版本約束。一個在[=, >, <, >=, <=, ~>, !=]
中的運算子,然後是一個(選用的)空格字元,然後是一個版本。[(&符號)約束]
- 一個&
(&符號) 字元,表示一個與相同 GEM 相關的附加約束將會接續。讀取&符號分隔的約束塊,直到遇到,
(逗號) 字元。
需求
格式
需求塊將總是包含 checksum
鍵。ruby
和 rubygems
鍵就像上方的約束,表示一個必要的 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
鍵
- 一個字母數字鍵。(冒號)
- 一個:
(冒號) 字元。值
- 鍵的值。值不得包含,
(逗號) 或:
(冒號) 字元。
GET - /names
傳回所有 rubygem 名稱的客製化文字格式,每行一個 rubygem 名稱。
目前沒有任何官方 rubygems 工具使用此 API。順序可能會變更。範例已截斷。
$ curl https://rubygems.org/names
---
_
-
0mq
0xdm5
[...SNIP...]
names
檔案格式
names
檔案格式為以換行符號分隔的簡單 rubygem 名稱清單。
在 ---
之前的所有行都應視為不透明。
---
每一行只包含一個 rubygem 名稱
RUBYGEM
此行的各個部分如下
RUBYGEM
- rubygem 的名稱。