CargoのRegistryについて解説します。
Registryとは?
Cargo,crateの文脈で言うとRegistryはcrateを配信するAPIです。
有名、というか公式のcrates.io以外の知名度はないに等しいので実質crates.ioだと思ってくれていいです。
Registryの役割はCargo向けにcrateをダウンロードできるようにしたり、アップロードできたり、所有者を変えたり、crateの情報を取得で来たりします。
crateのダウンロード方法
CargoがRegistryからcrateを取得する手段は以下の通りです。
- CargoがRegistryからindexを取得する
- indexの情報を基にcrateファイルをダウンロードする
index
indexには、crateの情報が保存されています。
決められたディレクトリ構成に則って配置されたjson"もどき"のファイルを保存してあります(内部はjsonのobjectを配列にせずに結合した形のファイル)。
中身の情報はほとんどCargo.tomlと同じです。
違いは、
- yanked (取り下げられているか)
- checksum (.crateファイルのSHA256 checksum)
くらいでしょう。
またindexにはcrate情報のほかにconfig.jsonがあります。
ここにはレポジトリのdl先やapiのURLが載っています。
index取得には二種類の方式があります。
git
gitはその名の通りgitでindexを取得します。
indexの全ファイル(!)が入ったレポジトリからclone,pullして取得します。
よって"遅い"です!
crates.ioの場合 https://github.com/rust-lang/crates.io-index にあります。
ディレクトリ構成としては基本的には
{1,2文字目}/{3,4文字目}/{crate名}
のファイルが置いてあります。例えばserdeなら https://github.com/rust-lang/crates.io-index/blob/master/se/rd/serde です。
4文字未満のcrateにはまたルールがあるのですが割愛…。
sparse
Rust 1.68で安定化🎉、1.70からデフォルト🎉🎉になった方式です。
必要なindexだけをHttpで取得してくれます。
パスはgitと同じです。
crates.ioからserdeを取得するならば https://index.crates.io/se/rd/serde でできます。
余談ですが、private registryのURLを設定する際にsparse+https://
のような形にしないといけないですが、あくまで設定する際の表記であって、内部ではただのhttps
から始まるURLでアクセスしてくれます。(勘違いしてた…)
crateのダウンロード
こちらは単純に指定された名前でダウンロードされるだけです。
indexに配置するconfig.json
のdlのkeyのURLから取得します。
基本的には{dlの値}/{crate}/{version}/download
(serdeならhttps://crates.io/api/v1/crates/serde/1.0.193/download
)
でダウンロードできますが、下の/{crate}以下はdlにpathを指定することで変更することもできます。
Web API
config.json
に"api"
のキーで保存されたurlがあるとそこに対してcargoがapiを実行できるようになります。
例えば以下のような機能が生えています。
- publish: Registryにアップロードする
- yank: crateのバージョンを取り下げ(yank)することができます。
- search: crateを検索する
- me: login用に誘導する
Authentication
認証です。crates.ioから引っ張てくるだけでは無用ですが、
自前でRegistryを立てる場合の認証を担います。
最近(1.74で)安定化されました!🎉
詳しくは別記事を作る(予定)です!
おわりに
ほとんどここを読めばわかるよ!
https://doc.rust-lang.org/cargo/reference/registries.html