MSBuildを学びたいのですが、誰かが簡単なビルドスクリプトを使って、拡張子が.csのすべてのファイルのvs.net2008プロジェクトを除外できるかどうか疑問に思っていました。
- ビルドを実行するにはどうすればよいですか?
- 通常、ビルドもどこに保存しますか?
MSBuildを学びたいのですが、誰かが簡単なビルドスクリプトを使って、拡張子が.csのすべてのファイルのvs.net2008プロジェクトを除外できるかどうか疑問に思っていました。
通常、次の構文を使用して、コマンド ラインから MSBuild スクリプトを実行します。
MSBuild <scriptfilename> /t:targetname
詳細については、http : //msdn.microsoft.com/en-us/library/0k6kkbsd.aspxをご覧ください。
プロジェクト ファイルからすべての .cs ファイルを解析して何を達成しようとしていますか? VS2005 以降では、プロジェクト ファイルはそれ自体がMSBuild スクリプトであるため、コマンド ラインで MSBuild を呼び出すだけで、適切なターゲットとしてプロジェクト ファイルの名前を指定できます。
そうは言っても、別のスクリプト ファイルを作成する場合は、通常、ルート プロジェクト フォルダーに保存します。
セミコロンで区切られた単一の文字列プロパティとしてファイルのリストが必要な場合:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Import Project="Project.csproj" Condition="Exists(Project.csproj')"/>
<Target Name="Test">
<Message Text="@(Compile)"/>
</Target>
</Project>
各ファイルを個別に表示できるようにしたい場合:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Import Project="Project.csproj" Condition="Exists(Project.csproj')"/>
<Target Name="Test">
<Message Text="%(Compile.FullPath)"/>
</Target>
</Project>
これらの各サンプルを見ていくと、最初の行 ( <Project ...>
) は、これが MSBuild プロジェクト ファイルであるという事実を識別し、DefaultTargets (コマンド ラインでターゲット (/t: ターゲット名) が指定されていない場合に実行されるターゲット) を定義します。ファイルの検証に使用されるスキーマ (xmlns) と、使用する MSBuild のバージョン (ToolsVersion)。
2 行目 ( <Import ...>
) は、"Project.csproj" という名前の MSBuild スクリプトが存在する場合は、その内容を含めるように MSBuild に指示します。
最後に、1 つのタスクを含む「Test」という名前のターゲットを定義します。そのタスクは「メッセージ」タスクで、メッセージ (「テキスト」に含まれるものは何でも) を画面に出力します。
最初のサンプルでは<Message Text="@(Compile)"/>
、"Compile" という名前の ItemGroup をセミコロンで区切られたリストとして参照しています。2 番目の例では、同じ ItemGroup を参照していますが、その ItemGroup 内の各アイテムをループして、"FullPath" メタデータ コンテンツを出力しています。(Compile ItemGroup は、2 行目でインポートした .csproj で定義されています。)
C:\projects\_Play\SimpleIpService>type \\sysrdswbld1\public\bin\mrb-vs2008.cmd
@echo off
call "c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
echo %0 %*
echo %0 %* >> %MrB-LOG%
cd
if not ""=="%~dp1" pushd %~dp1
cd
if exist %~nx1 (
echo VS2008 build of '%~nx1'.
echo VS2008 build of '%~nx1'. >> %MrB-LOG%
set MrB-BUILDLOG=%MrB-BASE%\%MrB-WORK%.%MrB-NICEDATE%.%MrB-NICETIME%.build-errors.log
msbuild.exe %~nx1 /t:Rebuild /p:Configuration=Release > %MrB-BUILDLOG%
findstr /r /c:"[1-9][0-9]* Error(s)" %MrB-BUILDLOG%
if not errorlevel 1 (
echo ERROR: sending notification email for build errors in '%~nx1'.
echo ERROR: sending notification email for build errors in '%~nx1'. >> %MrB-LOG%
call mrb-email "Mr Build isn't happy about build errors in '%~nx1'" %MrB-BUILDLOG%
) else (
findstr /r /c:"[1-9][0-9]* Warning(s)" %MrB-BUILDLOG%
if not errorlevel 1 (
echo ERROR: sending notification email for build warnings in '%~nx1'.
echo ERROR: sending notification email for build warnings in '%~nx1'. >> %MrB-LOG%
call mrb-email "Mr Build isn't happy about build warnings in '%~nx1'" %MrB-BUILDLOG%
) else (
echo Successful build of '%~nx1'.
echo Successful build of '%~nx1'. >> %MrB-LOG%
)
)
) else (
echo ERROR '%1' doesn't exist.
echo ERROR '%1' doesn't exist. >> %MrB-LOG%
)
popd