きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

MSBuildでASP.NET Web Formsのアプリケーションの発行を行う

諸般の事情により、ASP.NET Web Fromsのアプリケーションの発行をコマンドラインから行いたくなった為、MSBuildでやってみました。
色々やり方はあると思うのですが、xmlファイルに設定を記述してMSBuild.exeに食わせて実行する形で、今回は試行錯誤してみました。とりあえず私のやりたいことは満たせてると思っているのですが、ツッコミとかアドバイスをいただけると助かりますので、よろしくお願いします。

前提

今回は以下を前提にやっています。多分、VS2008以降のASP.NETならほぼそのまま行けるんじゃないかと思います。

  • VSのバージョン
  • プロジェクトテンプレート
    • ASP.NET Webアプリケーションプロジェクト
  • .NETのバージョン
    • 4

MSBuildファイル

以下の内容でファイルを作ります。ファイル名は今回は「myBuild.xml」にしていますが、拡張子含めてなんでも良いと思います(というかMSBuildファイルの標準的な拡張子ってなんなんでしょうか?) ファイル名は任意で良くとりあえず今回は「myBuild.proj」とします。文字コードxml宣言と合わせてください(utf-8が無難と思います)。

追記:
設定ファイルはprojで終わる拡張子にすると、MSBuildがカレントディレクトリから自動検索して実行してくるそうです。
id:ladybug さん、ありがとうございます。

なお、今回は以下を例にしているので、適宜読み替えてください。

  • ソリューションファイルのフルパス
    • C:\Users\kiyokura\Documents\Prj\WebApp1\WebApp1.sln
  • プロジェクトファイルのフルパス
    • C:\Users\kiyokura\Documents\Prj\WebApp1\WebApp1\WebApp1.csproj
  • 出力先(発行先)フォルダ
    • C:\Users\kiyokura\Deploy\WebApp1
  • ファイル名
    • myBuild.xmlmyBuild.proj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Run" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <!-- 該当のソリューションファイル(sln)を指定 -->
    <SolutionFile>C:\Users\kiyokura\Documents\Prj\WebApp1\WebApp1.sln</SolutionFile>

    <!-- 該当Webアプリケーションプロジェクトのプロジェクトファイル(vbproj or csproj)を指定 -->
    <WebAppProjectFile>C:\Users\kiyokura\Documents\Prj\WebApp1\WebApp1\WebApp1.csproj</WebAppProjectFile>

    <!-- 出力のフォルダを指定 -->
    <DeployFolder>C:\Users\kiyokura\Deploy\WebApp1</DeployFolder>
  </PropertyGroup>

  <Target Name="Run">
    <CallTarget Targets="Build"/>
    <CallTarget Targets="Publish"/>
  </Target>

  <Target Name="Build">
    <MSBuild Projects="$(SolutionFile)"
             Properties="Configuration=Release;" Targets="Clean;Build" />
  </Target>
 
  <Target Name="Publish">
    <RemoveDir Directories="$(DeployFolder)"
               ContinueOnError="true" />

    <MSBuild Projects="$(WebAppProjectFile)"
             Targets="_WPPCopyWebApplication;ResolveReferences;"
             Properties="Configuration=Release;
                         WebProjectOutputDir=$(DeployFolder);
                         OutDir=$(DeployFolder)\bin/" />
  </Target>
</Project>

MSBuildの実行

ここまでできれば実行は簡単です。MSBuild.exeの第一パラメータに上記のファイルを指定るだけです。MSBuild.exeはMicrosoft.NET\Framework\の各バージョンの下なんかにありますので、例えばコマンドプロンプトを開いてmyBuild.projと同じディレクトリに移動し、


C:\> C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild myBuild.proj
なんて感じで実行すればOKです。
発行の度に実行すると思いますので、上記をそのままバッチファイルにしておくと楽かもしれません。

参考&謝辞

今回、下記のサイトを参考にさせていただきました。ありがとうございました。

追記

私がやりたかったのは『ASP.NET Webアプリケーションプロジェクトにて、”IDEの[発行]ウィザードを使ってファイルシステムにデプロイする”事を、コマンドラインから行う』ということです。

何のために?と言われるといくつか理由はあるのですが、代表的なものは

  • IDEで開発中とリリース時でビルド構成を切り替えるのが面倒
    • 間違ってリリース用ビルドをデバッグ用の構成でビルドしてリリースしちゃう事故を防止したかった
  • 色々連携&自動化したい
    • 具体的には未定ですが、TFSやビルドサーバと連携してなんか色々ズルしていい感じにできないか考える為の最初のステップとして

というところです。