Cargo 1.34の最も大きな特徴は、 代替カーゴレジストリの使用をサポートしたことだ。これは企業環境において、ゲームチェンジャになる可能性がある。さらに今回のリリースでは、ドキュメンテーションテストで"?
"がサポートされ、標準ライブラリにいくつかの改良が加えられている。
これまでは、プロプライエタリあるいはクローズドなソースコードを使用している開発者にとっては、Cargo.toml
ファイル内のgit
あるいはpath
句を通じて依存関係を指定する、というのが唯一の選択肢だった。ほとんどの場合はこれでうまくいくのだが、バージョン管理をサポートしていない、という大きな欠点があり、常に最新バージョンを使用しなければならなかった。Rust 1.34では、Cargoが代替レジストリをサポートするようになった。これはcargo/config
内で指定するもので、crates.io
とも共存する。
[registries]
my-registry = { index = "https://my-intranet:8080/git/index" }
プライベートレジストリを作成すれば、依存関係の宣言にregistry
キーを使用することで、cargo.ioではなく、そのプライベートレジストリから依存関係を取得できるようになる。
[dependencies]
other-crate = { version = "1.0", registry = "my-registry" }
最小限構成のカーゴレジストリは、 インデックスを格納したローカルgitリポジトリと、cargo package
を使って作成された.crate
ファイルを圧縮してホストする、HTTP/HTTPSサーバで実装することができる。このインデックスは、config.json
ファイルと、利用可能な各クレートにひとつのファイルで構成される。config.json
ファイルでは、利用可能なクレートを取得するインデックス内の場所と、利用可能であれば公開用APIエンドポイントを指定する。パッケージファイルには基本的に、そのクレートで利用可能なパッケージバージョンのリストが含まれている。
代替レジストリでも、cargo publish
をサポートすることができる。ただしこの場合は、単純なgitリポジトリでは不十分で、 config.json
ファイル経由で参照されるWeb APIを提供する必要がある。このAPIは、publish (/api/v1/crates/new
), yank (/api/v1/crates/{crate_name}/{version}/yank
), unyank (/api/v1/crates/{crate_name}/{version}/unyank
)など、さまざまな操作をサポートするが、ただし現時点では、そのようなAPIを汎用的かつ再利用可能に実装したものは存在しない。
代替レジストリにクレートを公開するには、最初にcargo login
コマンドを使用して、認証トークンを?/.cargo/credentials
に保存する必要がある。これを行うことで、 cargo publish --registry=...
が使用可能になる。
言語レベルでは、前述のように、ドキュメンテーションテスト中の?
の使用がサポートされるようになった。 ドキュメンテーションテストとは、ドキュメントに含まれている例が、rustdoc
によって一種の単体テストとして使用可能になるという、Rustの便利な機能である。現時点では、fn main()
を含まない場合には、?を使用することはできない。
標準ライブラリにも多くの変更が加えられた。TryFrom
とTryInto
の変換特性は、不確実な(fallible)変換のサポートを追加することで、安定性が向上している。例えばTryFrom
では、i64からi32への数値変換が可能かどうかを確認することができる。
let big_number = ...i64;
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());
Rust 1.34標準ライブラリには、この他にも安定化が図られており、リリースノートで詳細を確認することができる。
今後の計画としては、Steve Klabnik氏がHacker Newsスレッドで、 async/await
のサポートが今後数リリース内に登場することを発表している。その他にもconstジェネリクスや総称関連型、特殊化など導入が期待される。