私は最近、複数の.netソリューションが存在するold legacyコードベースで新しいクライアントの作業を開始しました。通常、それぞれがそのソリューションに固有のいくつかのプロジェクトをホストしますが、「借用」/「リンク」します(既存のプロジェクトを追加する)技術的に他のソリューションに属している他のいくつかのプロジェクト(少なくともTFSのフォルダー構造では)
私はこれが絡み合った設定を見たことがありません。明確なビルド順序がありません。ソリューションAのプロジェクトは、ソリューションBでホストされているプロジェクトの出力ディレクトリから直接dllを参照するだけです。フォルダ構造で遠く離れています。
すべてが開発者の怠惰のために最適化されているようです。
彼らがCIサーバーを持っていなかった理由に直面したとき、彼らはそのように編成されたコードでセットアップするのは難しいと答えました。 (私は今それを設定し、このコード組織を呪っています)
ソリューションは、デプロイメントアーティファクト(一緒にデプロイする必要があるものは同じソリューション内にあります)を中心に編成されていますthinkは賢明な決定ですが、それらのソリューション(プロジェクト)の内容はすべて場所。
複数のソリューション/デプロイメントアーティファクト全体で共通のクラスライブラリを再利用するときに使用するベストプラクティスのコンセンサスはありますか、
私は、他のソリューションに属する既存のプロジェクトを含めるのが好きではありません。 1つのソリューションでそのプロジェクトを編集すると、別のソリューションで何かが完全に壊れてしまう変数が多すぎます。次に、その問題を修正することで、元のソリューションを壊してしまいます。泡立て、すすぎ、繰り返します。
この種の依存関係が複数のソリューションにリークする場合、依存コードをOWNソリューションに分離し、参照として含まれるブラックボックスライブラリを作成します。私の考えでは、ソリューションは互いに絡み合っているため、すべてのソリューションの共有プロジェクトでデバッグを行うことができます。ライブラリが正しくビルドおよびテストされている場合、この種のデバッグは実際には必要ありません。ライブラリは独自のメリットに耐えることができ、あらゆる消費者プロジェクトの期待が一貫して満たされるように徹底的にテストする必要があります。
私はあなたが言及しているようなTFS構造を実際に整理しましたが、それはCIに独特の課題を提示しますが、多くの異なる利点があります。明確なものの1つは、別個の.NETプロジェクトへの適切なコンポーネント化をサポートおよび奨励することです。したがって、100%のテストカバレッジを促進することにより、優れたTDDをサポートします。すぐに私はあなたが対処できるいくつかの問題に気づきました。
ソリューションAのプロジェクトは、ソリューションBでホストされているプロジェクトの出力ディレクトリから直接dllを参照するだけの場合もあれば、フォルダー構造にFARが存在していても、プロジェクトが直接含まれている場合もあります。
他のディレクトリの出力へのバイナリ参照は良いアプローチではなく、プロジェクト参照と混在する場合にも悪いアプローチになります。少なくとも一貫性を保つために、バイナリ参照をプロジェクト参照に変更することをお勧めします。この時点で、各ソリューションは単一のビルド可能なアプリケーションまたはアプリケーション層を表すことができます(例:SuperApp.sln、OtherAppServices.sln、OtherAppPresentationTier.sln)。
すべてのプロジェクトを構築するには、マスターソリューションも作成することをお勧めします。マスターソリューションにはすべてへのプロジェクト参照があり、基本的には、アプリケーションスイートのすべてのプロジェクトを処理する単一のビルドコマンドを持つという唯一の利点のために存在します。開発者は、マスターソリューションをアクティブな開発またはデバッグに使用しないでください。これにより、ビルドアーティファクトの組み立てがはるかに簡単になります。
その後、シンプルなバッチ、PowerShell、またはPerlスクリプトを使用してデプロイできます。これにより、基本的に適切なソリューションまたはマスターソリューションが構築され、すべてが適切な環境に展開されます。これは、正しく実行すれば、任意のCIサーバーに簡単に統合できます。
•個別のデプロイメントアーティファクト間でビジネスロジックの共有を容易にする方法
一般的なビジネスロジック用のプロジェクトを作成するか、よりグローバルまたはユニバーサルなビジネスロジックに対する懸念をより適切に分離します。これを参照したいすべての展開可能なソリューションは、プロジェクト参照によってそうする必要があります。
TFSでコードを編成する場合、共通または共有プロジェクトをディレクトリツリーの上位レベルに保持することで、これを簡単に実現できます。