目的
Rust で依存しているクレートに(自分にとっての)不都合があった時、勝手に書き換える方法を紹介します。
使用例:勝手に feature を追加したい、一部の不要なコードを消したい
ほとんど以下の公式ドキュメントに書いてあります。
直接依存している場合
自分の Cargo.toml で直接依存先として指定している場合。
- 依存先のリポジトリを fork か clone する
- 好きに書き換える
- fork した場合は commit&push も
- 自分の
Cargo.tomlのdependencyセクションを編集する- before:
クレート名 = "バージョン" - after (fork):
クレート名 = { git = "https://github.com/フォーク先のURL.git" }- ブランチを変えたければ
, branch = ブランチ名で指定
- ブランチを変えたければ
- after (clone):
クレート名 = { path = "クローンしたパス" }
- before:
- おわり
間接的に依存している場合
自分の Cargo.toml で直接指定した依存先の、そのまた依存先のクレートを書き換えたい場合。
↑の方法を再帰的に行うこともできるが、手間がかかるので。
- 依存先のリポジトリを fork か clone する
- 好きに書き換える
- fork した場合は commit&push も
- (ここまでは同じ)
- 自分の
Cargo.tomlに[patch.crates-io]セクションを追加する- ここで、各クレートの依存解決をする時の参照先を書き換えられる
- dependency と同様に、書き換え元・先を指定する
- fork:
クレート名 = { git = "https://github.com/フォーク先のURL.git" }- ブランチを変えたければ
, branch = ブランチ名で指定
- ブランチを変えたければ
- clone:
クレート名 = { path = "クローンしたパス" }
- fork:
- おわり
まとめ
Pull Request を出せばいい話なんですが、
- ハッカソンや研究の実装だとコミュニケーションの時間・時間が惜しい
- 自分だけに必要でマージしてもらうほどではない
ようなケースが個人的にはよくあります。
そんなわけで、無理やり書き換える方法を備忘録的に説明しました。