私はGitサブモジュールの大ファンです。バージョンとともに依存関係を追跡できるので、以前のバージョンのプロジェクトにロールバックし、対応するバージョンの依存関係を安全かつクリーンに構築できます。さらに、ライブラリの履歴は、ライブラリに依存している(およびオープンソース化されない)アプリケーションの履歴とは別個であるため、ライブラリをオープンソースプロジェクトとしてリリースする方が簡単です。
仕事中の複数のプロジェクトにワークフローを設定していますが、単一のモノリシックプロジェクトではなく、このアプローチを少し極端にするとどうなるか疑問に思っていました。サブモジュールを実際に使用すると、ワームの潜在的な可能性があることにすぐに気付きました。
一対のアプリケーション:studio
およびplayer
、および依存ライブラリcore
、graph
およびを想定します。network
依存関係は次のとおりです。
core
スタンドアロンですgraph
core
(サブモジュール./libs/core
)に依存network
上のcore
サブモジュール(サブモジュール./libs/core
)studio
依存graph
し、network
(サブモジュールに./libs/graph
及び./libs/network
)player
依存graph
し、network
(サブモジュールに./libs/graph
及び./libs/network
)
CMakeを使用しており、これらの各プロジェクトに単体テストとすべての作品があると仮定します。各プロジェクト(studio
およびを含むplayer
)は、コードメトリックス、ユニットテストなどを実行するためにスタンドアロンでコンパイルできる必要があります。
事は、再帰的git submodule fetch
であり、次のディレクトリ構造を取得します:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
プロジェクトでcore
2回複製されていることに注意してくださいstudio
。このディスクスペースの浪費とは別に、core
2回ビルドするため、ビルドシステムの問題が発生しますcore
。
質問
共通のネストされたサブモジュールの複数のコピーを取得せずに、バージョン付きの依存関係とスタンドアロンビルドを取得できるように、サブモジュールを整理するにはどうすればよいですか?
可能な解決策
ライブラリの依存関係がある程度示唆されている場合(つまり、「バージョンXで動作することがわかっている」または「バージョンXのみが公式にサポートされている」方法)次のシナリオを想像できます。
- ビルドシステムを用意し
graph
、network
どこで見つけるかを伝えますcore
(たとえば、コンパイラインクルードパスを使用して)。「standalone」と「dependency」の2つのビルドターゲットを定義します。「standalone」は「dependency」に基づき、ローカルcore
サブモジュールを指すインクルードパスを追加します。 - 追加の依存関係を導入
studio
しcore
ます:on 。次に、studio
buildscore
、core
サブモジュールの独自のコピーへのインクルードパスを設定し、ビルドgraph
しnetwork
て「依存関係」モードにします。
結果のフォルダー構造は次のようになります。
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
しかし、これは(更新は、いくつかのビルドシステムの魔法(私はこれがCMakeので行うことができますかなり確信しています)およびバージョンアップの一部に手作業のビットを必要とするgraph
も、更新が必要な場合がありますcore
とnetwork
の互換性のあるバージョンを取得するためにcore
、すべてのプロジェクトで) 。
これについて何か考えはありますか?