11

複数のソフトウェアプロジェクトでsingle master solution strategyを使用しています。最近、誰かが共通のコードに依存関係を追加して、新しい依存関係がソリューションに追加されるまで他のプロジェクトのソリューションを壊しました。この種の問題を排除または最小限に抑えるための良い戦略は何ですか?依存関係が追加されたときにマスターソリューションを自動的に更新するには?

私たちは、次を考えてきました:複数のパーティションソリューションと仕事を

  • は、依存関係を追加するために、他のプロジェクトを伝えるためにチェックインのログメッセージにキーワードを追加します(ただし、これは手動のプロセスである)
  • ツールを使用して、複数のパーティション化されたソリューション(VS2015で動作するすべての提案を自動化できます)からマスターソリューションを作成します?)

これまでの最大の単一マスタソリューションは115個のプロジェクトファイルなので、問題を解決する最良の方法でない限り、ソリューションを分割する必要はありません。

この問題が発生した場合、どのように解決しましたか?

+0

どのような言語ですか? C++?プロジェクト参照は、ソリューションファイルではなくプロジェクトファイルの一部ですので、それを使用する各ソリューションは自動的に参照を取得します。 – stijn

+0

はい、C++。参照を使用していますが、参照されたプロジェクトが解決策に含まれていない場合、Visual Studioにビルドを指示する方法はありますか? – traal

+1

私はかなり組み込みの方法がないと確信しています。 msbuildターゲットを使用してファイルを作成するだけで、すべてのプロジェクト参照をビルドしてから、そのファイルをすべてのプロジェクトに含めることができます。ほぼ完璧なのは、たとえそれがまだ成立していないということではない。ソリューションAには変更はありませんが、ソリューションAの外にあるプロジェクトからソースファイルに変更があります.Aはそれ自身のプロジェクトの変更を検出しないためです。これはおそらく修正される可能性もありますが、それはすでに難しいことです。とにかく:私が選ぶソリューションは、CIセットアップがあるので、ビルドの破損は早期に発見されます。] – stijn

答えて

2

組み込みの方法はありません(どのバージョンのVSでもインストールされているMSBuildファイルはプロジェクトのビルドを実行せず、機能リクエストはlike this oneです)。かなり簡単な解決策は、参照されたプロジェクトをビルド前のイベントとして構築し、別のプロジェクトを参照する各プロジェクトにそのファイルを含めるmsbuildファイルを作成することです。例えば、一般的なビルドツールまたはそうでディレクトリ内buildprojectreferenecs.targetsという名前のファイルを作成し、コンテンツ

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="BuildProjectReferences" BeforeTargets="BuildGenerateSources"> 
    <MsBuild Projects="@(ProjectReference)" 
      Properties="Configuration=$(Configuration);Platform=$(Platform)"/> 
    </Target> 
</Project> 

でこれは、単にそれを含むプロジェクトと同じ構成とプラットフォームと各ProjectReferenceを構築します。 projectreferencesを使用する各プロジェクトでこれをインポートします。インポートは、ProjectReference項目が定義された後に行われる必要があります。一番下のすべての方法:あなたがビルドを実行する場合、実際のコンパイルが参照されたプロジェクトのビルドを開始する前に、彼らがしている場合

... 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <!-- this is near the bottom already --> 
    <Import Project="..\BuildProjectReferences.targets" /> !<-- add this --> 
    ... 
</Project> 

今、(ひいてはその参照先のプロジェクトなどの)に関係なく発生します解決策かどうかいくつかの欠点:

  • プロジェクトのrefernceを追加しますが、このファイルは何もインポートしないことを忘れた場合は、ビルドが無条件に発生するので、参照プロジェクトがすでに構築されている場合は、ビルドが再び開始され
  • 起こります。ビルドシステムはすべての出力が最新であるとみなしてすぐに終了します。
  • VSのビルドシステムは、ソリューション外の参照プロジェクトの変更を検出しないため、ソリューション内のすべてのプロジェクトが、最新のものであり、ソリューションの外にある参照プロジェクトのソースファイルを変更すると、ビルドされません。しかし、コマンドラインビルドの場合はそうではありません。そこにはプロジェクトのビルドが開始されるため、参照プロジェクトもビルドされます。

すべての点で、価値があるかどうかはわかりません。間違いなく、このソリューションはプロジェクトのための単一のソリューションでなければならず、ソースから構築されたすべての依存関係を含む必要があります。それが起こることを確認するのは開発者の仕事です。コードを素早く行うための失敗をキャッチするには、コードベースへの各コミットを構築するビルドサーバがあり、エラーを速やかに発見することが最善のソリューションです。開発者は、間違いの通知を受け取り、すぐに修正を適用します(特にそれは些細なものです)。

関連する問題