1 つの貨物ワークスペースに my_project と my_inner_project の 2 つのプロジェクトがあります。どちらも gfx (および gfx_core と gfx_device_gl) に依存しています。gfx_device_core にバグが見つかったので、フォーク、クローン、ローカルでパッチを適用し、コミットする前にテストしたいと考えています。
プロジェクト構造:
-my_project
--my_inner_project
---Cargo.toml
--Cargo.toml
-gfx
--src
---core
----Cargo.toml #package gfx_core
---backend
----gl
-----Cargo.toml #package gfx_device_gl
---render
----Cargo.toml #package gfx
--Cargo.toml
ここで、my_project のビルド中に cargo で gfx のローカル コピーを使用するようにします。
- 最初のアプローチ (Cargo.toml のローカル パス): すべての gfx パッケージのソースを両方のプロジェクトの Cargo.toml のローカル パスに変更しました。 「パス」が指す依存関係はワークスペースの一部ですが、ワークスペース メンバーはファイル システムのワークスペース ルートの下に配置する必要があります。そのため、プロジェクトのビルドを拒否し、gfx* がワークスペースの一部であると不平を言いますが、ワークスペース ルートの下にはありません。私の知る限り、現在、この暗黙の「すべてがワークスペースにある」動作を変更する方法はありません。
- 2 番目のアプローチ ([replace]): このアプローチでは、上記と同じ動作が発生します。[replace] 内で指定されたパスも暗黙的にワークスペースに追加されます。
3 番目のアプローチ (ローカル パスのオーバーライド): .cargo/config のパスに gfx を追加しました。また、オーバーライドされたパッケージのバージョンと .toml で参照されるバージョンが一致する必要があるため、.tomls の gfx パッケージのソースを crate.io から git リポジトリに変更する必要がありました。これは、安定した錆 1.13 でも機能しません。警告が表示されます:
warning: path override for crate `gfx_device_gl` has altered the original list of dependencies; the dependency on `gfx_core` was either added or modified to not match the previously resolved version This is currently allowed but is known to produce buggy behavior with spurious recompiles and changes to the crate graph. Path overrides unfortunately were never intended to support this feature, so for now this message is just a warning. In the future, however, this message will become a hard error. To change the dependency graph via an override it's recommended to use the `[replace]` feature of Cargo instead of the path override feature. This is documented online at the url below for more information.
そしてエラー:
error: failed to find lock source of gfx_core
プロジェクト内の Cargo.toml で指定された gfx とリポジトリのローカル コピーは同一であるため、この警告が出力される理由がわかりません。
エラーはさびナイトリーで修正されているので、インストールして、最終的にローカル gfx コピーでプロジェクトをコンパイルすることができました。
そのため、比較的基本的なタスクに苦労して 1 日を過ごした後、私は解決策を見つけました。これはナイトリーでのみ機能し、機能リリースでは機能しないと約束しています。
私の質問:
- それはどのように行われるべきですか?
- この警告を取り除く方法は?