別のプロジェクト「B」の展開パッケージを必要とするプロジェクト「A」があります。
「A」が「B」に依存し、「A」のビルド前イベントで展開パッケージが「B」用に作成されるように、これを自動的に実行したいと考えています。
これを手動で行う方法を知っています (右クリック "B" -> Build Deployment Package -> build "A")。正常に動作しますが、説明どおりに自動化するにはどうすればよいですか?
(「A」は実際には WIX プロジェクトです)
別のプロジェクト「B」の展開パッケージを必要とするプロジェクト「A」があります。
「A」が「B」に依存し、「A」のビルド前イベントで展開パッケージが「B」用に作成されるように、これを自動的に実行したいと考えています。
これを手動で行う方法を知っています (右クリック "B" -> Build Deployment Package -> build "A")。正常に動作しますが、説明どおりに自動化するにはどうすればよいですか?
(「A」は実際には WIX プロジェクトです)
これを行うには、次の 2 つの方法があります。
1 つ目の利点は、A が B についてあまり知らなくてもよいことです。2 つ目の利点は、開発中にパッケージをビルドするステップなしで B をビルドできることです。
ご存知かもしれませんが、Visual Studio プロジェクトは MSBuild プロジェクトです。ソリューション エクスプローラーのプロジェクトのコンテキスト メニューから [プロジェクトのアンロード] を選択し、[編集] を選択して、Visual Studio でそれらを編集できます。多くの場合、この方法でビルド ステップを追加する方が、ビルド イベント エディターを使用するよりも簡単で、必要になる場合もあります。プロジェクト ファイルのカスタマイズについて手がかりを残したい場合は、"rem" コマンドをビルド前イベント フィールドに追加できます。
上記のいずれの場合でも、プロジェクト B のパッケージ ターゲットは、プロジェクト A のビルド ターゲットの前に実行する必要があります。上記の 2 番目のケースを選択して、このMSBuild タスクを A の BeforeBuild ターゲットに追加します。
<MSBuild
Projects="relative-or-absolute/path/to/B.xxproj"
Targets="Package">
</MSBuild>
私はこのプレビルドイベントコードになりました。ただし、トムのソリューションの方がおそらく優れています。
echo off
set THEME_REGKEY=HKLM\Software\Microsoft\MSBuild\4.0
set THEME_REGVAL=MSBuildOverrideTasksPath
REM Check for presence of key first.
reg query %THEME_REGKEY% /v %THEME_REGVAL% 2>nul || (echo No theme name present! & exit /b 1)
REM query the value. pipe it through findstr in order to find the matching line that has the value. only grab token 3 and the remainder of the line. %%b is what we are interested in here.
set THEME_NAME=
for /f "tokens=2,*" %%a in ('reg query %THEME_REGKEY% /v %THEME_REGVAL% ^| findstr %THEME_REGVAL%') do (
set THEME_NAME=%%b
)
REM Possibly no value set
if not defined THEME_NAME (echo No theme name present! & exit /b 1)
REM replace any spaces with +
set THEME_NAME=%THEME_NAME: =+%
if errorlevel 1 goto BuildEventFailed
%THEME_NAME%MSBuild "$(SolutionDir)Web\Web.csproj" /t:Build;Package /p:Configuration=$(Configuration)