web-dev-qa-db-ja.com

複数のビジュアルスタジオソリューションをリンクする方法は?

私には3つのソリューションがあり、ソリューションAをコンパイルするには、ソリューションBおよびCからビルドされたバージョンのdllが必要です。 1つのソリューションにマージすることはできません...

これまでのところ、Visual Studioはソリューションの参照をサポートしていないようで、msbuildは、私がその方法を試した場合に、あるソリューションを別のソリューションからビルドしていることを知るのに十分なほど賢いようです。全体的な目標は、複数のソリューションが1つしかないように見えるようにすることです。ソリューションAのみです。

これはよくある問題だと思いますが、どうすればうまくリンクできますか?

44
Simon P

この質問は different でポップアップしましたが、- related の形式です。実際には これをカバーするMSDNページ があります。

あなたが探しているのは、大規模システム用のパーティション化された単一ソリューションモデルに似たマルチソリューションアプローチです。すべてを構築し、コンポーネント間の依存関係を維持する1つの「すべて」のソリューションを用意します。これは、ソリューションAを構築する必要があるときに構築するものです。次に、コンポーネントBまたはCのみを含む個別のソリューションがあります。基本的に、3つのソリューションがありますが、ソリューションBおよびCのプロジェクトをソリューションに追加しますA.

30
Greg D

Visual Studio 2008では、既存のプロジェクトを複数のソリューションに含めることができることを最近発見しました。これまでの唯一の欠点は、共有プロジェクトに変更を加え、その共有プロジェクトを使用する複数のソリューションを開いている場合、他のソリューションを「リロード」するように求められることです。

したがって、プロジェクトを必要とするすべてのソリューションに「既存のプロジェクトを追加」するだけです。現在のサイトでTFSを使用していますが、ソース管理エーテルに問題はないようです。

4
Paul Redman

私が信じているのは、プロジェクトレベルです。ソリューションBおよびCに含まれるプロジェクトをビルドし、ソリューションAの関連プロジェクトにDLLへの参照を追加します。

Msbuildでは、プロパティグループがある場合

<PropertyGroup>

<SolutionsToBuild>SolutionB</SolutionsToBuild>
<SolutionsToBuild>SolutionC</SolutionsToBuild>
<SolutionsToBuild>SolutionA</SolutionsToBuild>
</PropertyGroup>

次に、MSBuildタスクを実行します。

<MSBuild Projects="@(SolutionsToBuild)"/>

お役に立てれば

3
Dean

マージプロセスを自動化して時間を節約することができます: http://code.google.com/p/merge-solutions/

少し異なる問題がありましたが、1つの共通ライブラリを使用していた約15のソリューション(合計で約150プロジェクト)でした。問題は、共通ライブラリから冗長なコードをリファクタリング/根絶するために、それらすべてを1つにマージしようとした場合です。 1. 15のソリューションをマージするには、VSで多くのクリックと待機が必要です2.結果のソリューションは最新ではありませんでした。

1
bushed

MakefileプロジェクトをソリューションAに追加して、ソリューションBおよびCをビルドし(msbuildを使用するなど)、AのすべてのプロジェクトをそのMakefileプロジェクトに依存させることができます。この方法では、BとCのプロジェクトにプロジェクト参照を追加することはできませんが、dll参照を使用でき、常に最新のソースからビルドされます。

0

プロジェクトのビルド前イベント(ソリューションA)で依存するdll(ソリューションBおよびC)のコマンドラインビルドコマンドを追加しようとすることができます。

0
Brann

プロジェクトAと同じソリューションにプロジェクトBとCを配置できない場合、プロジェクトAをビルドするときに最新のソースコードを含むBとCのバイナリがあることを確認する方法はありません。

私が見た最も簡単な解決策は、ソースコードリポジトリに共通のフォルダーを作成し、共有する必要がある場合にすべてのプロジェクトがバイナリをコピーすることです。ローカルフォルダーがリポジトリと同じように見える限り、他のすべてのプロジェクトはそのフォルダー内のバイナリを参照できます。

完璧なソリューションではありませんが、操作は非常に簡単です。

0
user16324

スクリプトをビルド前のイベントのコマンドラインに入れ、プロジェクトAがビルドに失敗した場合、メッセージアラートをスローすることで問題を修正しました

ECHO "build A project"
set AppMsg ="%SystemRoot%\System32\msg.exe"
set AppMsg
if not "%ProgramFiles(x86)%" == "" (
if exist "%SystemRoot%\Sysnative\*" set AppMsg="%SystemRoot%\Sysnative\msg.exe"
)
set AppMsg
taskkill /f /im "%PROGRAMFILES(X86)%\MSBuild\14.0\Bin\msbuild" "$(SolutionPath)" /t:Project_A_Name /p:Configuration=Debug;TargetFrameworkVersion=v4.5 /p:Platform="Any CPU" /p:BuildProjectReferences=false /p:VSToolsPath="%PROGRAMFILES(X86)%\MSBuild\Microsoft\VisualStudio\v14.0" 2>nul 1>nul
echo ERRORLEVEL %ERRORLEVEL%
if ERRORLEVEL 1 (
ECHO "failed to build test project"
%AppMsg% * "failed to build test project"
)
exit 0
0

この答え によると、関連するソリューションを構築する独自のバッチファイルを作成することをお勧めします。

ビルドプロセスがビルドの進行状況(Visual Studioの[出力]ウィンドウと同様)をビルドの実行ごとにプロモートコマンドに出力するため、これは非常に便利です。

さらに、あるソリューションを他のソリューションより先にビルドする必要がある場合は、次のように独自のビルド順序を記述できます。

  1. ビルドソリューションB
  2. ビルドソリューションC
  3. ビルドソリューションA(内部では「ソリューションB」と「ソリューションC」のビルドファイルを使用)

私はすぐに 上記のビルド順序を明確にするスクリプト を記述し、最新のVisual Studioバージョンのほとんどをサポートしています。

よろしく。

0
Eido95