私が見てきたすべてのパッケージ マネージャーで最も困難なタスクの 1 つは、競合する依存関係を処理することです。
次の架空のアプリケーションSwiftAppを操作してみましょう。これは、いくつかのサードパーティ パッケージに依存しています。
- SwiftApp
- packageA@latest
- packageC@1.0.0
- packageD@latest
- packageB@latest
- packageC@2.0.0
- packageE@latest
上記の依存関係グラフから、SwiftAppの依存関係の両方が packageC を使用していることがわかりますが、メジャー バージョン識別子は異なります。ほとんどの言語エコシステムでは、これが問題になります。メジャー バージョンのバンプは、通常、以前のメジャー バージョンとの下位互換性がないコードに変更が加えられたことを意味します。
言語/コンパイラ/その他の関連コンポーネントの技術的能力に応じて、パッケージ マネージャーは次のいずれかの方法で実装できます。
- インストール/コンパイルの拒否 (php、ruby、python?、その他?)
- 気にする必要はありません。潜在的なコンパイラ エラーは開発者に対処させてください (???)
- 両方のパッケージに個別にpackageCをインストールします(Node.js、その他?)
3 番目のオプションは、言語またはコンパイラ自体による適切なサポートによってのみ実現できます。
この依存関係グラフは、Swift で破損することなく実現できますか?
つまり、packageA が packageC のバージョン 1.0.0 を持つ (そして使用する) ことは技術的に可能で、packageBはバージョン2.0.0になりますか?
Swift が現在オープンソースであり、独自のパッケージ マネージャーが付属しているという最近の発表を考えると、この質問は、Swift パッケージ開発に関心のある将来の読者にとって非常に価値があると思います。