Compartilhar via


[Visual Studio|WDP] Web Deployment Projects Dec. 2007 CTP の紹介と注意点

※ Web Deployment Projects は正式版がリリースされました。 この投稿中の注意点の部分は解消されています。
  詳しくは、 こちら をご覧ください。[2008.01.30 追記]

こんにちは。先日の Visual Studio 2008 リリース記念イベントである「Visual Studio 2008 Ready Day」の私のセッション(「B-3: Visual Studio Team System 2008 で実践する業界プラクティスを用いたソフトウェア開発」において、Web Deployment Projects (以下、WDP)の話を(チームビルドの実演の最中に)させていただきました。

その際に、「現在 Visual Studio 2008 用の WDP は CTP 版である」ことと、「Web.config のリプレースなどでは書き換えが必要である」ということだけをお伝えしました。当然セッション自体が WDP に特化したものでないため、それ以上踏み込んだ説明は控えさせていただきましたが、ブログに載せるというお約束はさせていただきました。

ということで(^^; この投稿が それ にあたります。

WDP のダウンロード先のご案内

         Visual Studio® 2008 Web Deployment Projects - December 2007 CTP

このツールは、2007年の11月30日に提供開始となっています。

WDP とは?

次に WDP ってなに? というのを簡単に説明させていただきます。といっても名前の通りです。

Web アプリケーション(Web サイト)の Deployment を行うための Projects

です。

セッション中にも触れましたが、Web アプリケーションの開発中には当然、接続するデータベースや WCF などのサービスは、開発時に利用できるものを使うはずです。そしてそれらは、通常、システムテストなどの検証環境、本番環境では、接続設定が異なります。また、Web アプリケーションを配置する IIS も異なっています。

たとえば、開発時には、データベースとしては、SQL Server Express Edition や SQL Server Developer Edition を用い、Webサーバー、アプリケーションサーバーは、IIS は使わず ASP.NET 開発サーバーを使ってデバッグや単体テストを行うとします。

検証時、本番稼動時には、データベースは SQL Server Enterprise Edition そして Web サーバー、アプリケーションサーバーは、Windows Server 2008 上の IIS 7.0 を使うなどです。

このときに、注意すべき点は、IIS への配置と、それに伴い各種の接続設定情報の書き換えですね。要するに Web.config の書き換えが必要となるわけです。

Web.config の書き換えや IIS へのデプロイなどを行ってくれるプロジェクトを作成・設定できるのが WDP になります。そしてこのプロジェクトをビルドすると、デプロイが実行できるようになっています。

実体は何かというと、MSBuild のファイルになります。そして GUI でこれらの設定が行えるようになっているというイメージです。

WDP の使い方

インストールすると、Visual Studio 2008 上から以下のメニューが利用できるようになります。

image 
[Add Web Deployment Project...]

このメニューは、Web アプリケーションや Web サイトのプロジェクトを右クリックすることで表示されます。要するに、1つの Web 関連プロジェクトに対して 1つの Web Deployment Project が作成される形となります。

作成した結果は、

image

のような感じです。この例では、OrderWeb という Web アプリケーション プロジェクト用の OrderWebDeployment というデプロイ用のプロジェクトが作成されたことになります(ちなみに WDP のデフォルトのプロジェクト名は、OrderWeb.csproj_deploy という感じになりますが、名前は変更しても構いません)。

プロジェクトファイル名は、OrderWebDeplolment .wdproj となります。

次に設定方法ですが、この WDP のプロジェクトをダブルクリックしてみてください。GUI の設定画面が起動します。

image

個々の項目の詳細説明は、今回は省かせていただきます。特徴としては、構成単位で配置設定を決定できるという点(要するに開発時やリリース時などで設定を変えられるということです)、そしてやはり配置の詳細設定ですね。

配置の設定は、Deployment というところにあります。

image

一目瞭然ではありますが、英語 UI でもありますので、説明も少しさせていただきます。前述のように配置時には、Web の設定( Web.config)を変更する必要がありますが、これを「Enable Web.config file section replacement」チェックボックスを ON にし、「Web.config file section replacements:」に置き換え箇所を指定することで置き換えを行ってくれます。

たとえば、ConnectionStrings を置き換えたければ、

ConnectionStrings=ConnectionStringsForStaging.config;

などを記述を行い、ここで指定した ConnectionStringsForStating.config を Web アプリケーションのプロジェクトに追加します。
※ WDP のプロジェクトではありませんので、ご注意ください(というか WDP プロジェクトには項目追加できないので間違えないと思います・・・)。

ちなみに、階層が深い位置の設定を置き換えたい場合は、"/"で区切ってしているすることができます。

system.serviceModel/client=ws_client.config;

これは、

       <system.serviceModel>
          <client>
             ...
          </client>
          ...
       </system.serviceModel>

の <client></client> 部分の置き換えということになります(この例は、WCF への接続設定部分ですね)。"=" 以下に記述した設定ファイル名(上記例だとws_client.config)の中身は <client></client> の部分だけを記述しておきましょう。

同じ画面で IIS の仮想ディレクトリの作成などの設定も行えるようになっています。

どこを修正すると動くようになるのか

残念ながら、設定が完璧でも Web.config の置き換えでエラーとなってしまいます。

image 
web.config(1): error WDP00002: missing section system.serviceModel/client.

(以下、私の調査結果と私の個人的解釈です)
この問題は、WDP のビルド(要するに配置のプロセス)に起因するもののようです。WDP ではビルド時に、テンポラリのフォルダを作成し、そこで配置するための下準備を行っているようです(デフォルトでは WDP プロジェクトの直下に TempBuildDir というフォルダが作成されます)。ここでなんらかのエラーが発生するとこの TempBuildDir がゴミ(?) として残ります。

image

ここで本来は、Web.config の置き換えは、コンパイルして、DLL のマージをしてという一連の流れのあとにターゲットとなるフォルダ($(WDTarget))で実施されなければならないのですが、このフォルダに必要なファイル群が作成/コピーされる前に、このプロセスが動いてしまっているように見えます。

そこで、WDP のインストールディレクトリに格納されている target ファイル(C:\Program Files\MSBuild\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets)を確認すると、ビルドの順序は、

_PrepareForBuild;
_SplitProjectReferencesByType;
_ResolveReferences;
_ResolveProjectReferences;
ResolveAssemblyReferences;
_CopyBeforeBuild;
BeforeBuild;
AspNetCompiler;
BeforeMerge;
AspNetMerge;
AfterMerge;
ReplaceWebConfigSections;
CreateVirtualDirectory;
AfterBuild

となっているんですね。そこで、上述の Web.config の置き換えと、ターゲットディレクトリへの配置をどこでやっているのかを見てみたら、

  • Web.config の置き換え: ReplaceWebConfigSections
  • 配置: AfterBuild

となっているのです。AfterBuild で $(TempBuildDir) から $(WDTarget) へファイル群のコピーを実施しているのですが、それより前に ReplaceWebConfigSections が動いてしまっているわけです。

なので、このあたりを AfterBuild から AfterMerge に移動してあげると、Web.config の置き換えが正常に行われます。

# なんか最初の TempBuildDir の説明と最後の方が矛盾している気がするのですが、Web.config の設定は最後に WDTargetDir でやってしまえ!と思えば、処理としてはいいかと思います。本当は TempBuildDir で行うべきなのか???でも IIS 仮想ディレクトリの作成も考えるとやはりこの位置で実施されるのがいいと思うし。このあたりの解釈含めて正式リリース版を待ちたいと思います。

このあたりについては、以下のフォーラムのコメント欄が非常に参考になります:
https://www.bottleit.com.au/blog/post/Web-deployment-project-CTP-for-VS2008---missing-connectionStrings-element.aspx
# KNさんのコメント部分をご覧ください。

余談ですがこれを解決するのにどんだけ苦労したことか。 Ready Day でどうしてもデプロイを自動化したく、もろもろの仕事をしながら夜な夜な WDP と格闘していました。で、ある程度 CTP 版の問題がわかった時点で、海外のフォーラムでもこのあたりが取り上げられているのをようやく発見しました!(上述のフォーラムです)私が気がついたポイントと同じところだったのでうれしいやら、サーチしきれなかった自分が悔しいやらでした(^^;

KNさんのコメントにある626行目の変更は、そこではなく、AspNetCompiler の ToggleDebugCompilation のところではないかな?と思うのですが、私がセッションでデモした際の該当ファイルをこのブログの添付ファイルとして置いておきます(※ご自身の責任のもと、ご利用や変更の参考にしていただければと思います)。

添付のものに変更する場合は、オリジナルのファイル(C:\Program Files\MSBuild\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets)のバックアップを取った上で、置き換えてみてください。

※追記: 添付のファイル中の $(TempBuildDir) の定義のところで  D:¥Temp¥TempBuildDir となっている箇所があります。適時皆さんの環境に変更してください。デフォルトの相対パスでの動作は未検証なので、明日に実施し、ここで報告いたします。 [2008.01.22 21:30]
※検証の結果ですが、やはり規定の設定である .\TempBuildDir\ ではうまく動作しませんでした。そこで私のお勧めは、$(temp)\TempBuildDir\ とすることです。これでビルド実行を行ったユーザーの %TEMP% にTempBuildDir が作成されるようになります。ということで、この変更を行ったものをこの投稿の添付ファイルとして公開しておきます。 [2008.01.23 10:30]

VSが起動された状態で、このファイルを置き換えた場合は、WDP プロジェクトを一度、アンロードして、再度読み込んだ方がよさそうです。

最後に、Ready Day のデモでは、継続的インテグレーションの延長線上で、WDP での Web.config の書き換えのみを行いました。今回は IIS への配置自体は、タイミングを考慮し、WDP では行いませんでした。ではどこで行ったのか?というと Team Build の方(TFSBuild.proj)で記述しました。このあたりはいろいろな考え方があると思いますので、まだ整理した上で投稿したいなと思っています。

P.S. 誤字脱字、記載ミスを随時訂正してます(「延長戦上」とか)。 

ながさわともはる

wdp_target.zip

Comments

  • Anonymous
    January 21, 2008
    こんにちは。先日の Visual Studio 2008 リリース記念イベントである「Visual Studio 2008 Ready Day」の私のセッション(「B-3: Visual Studio

  • Anonymous
    January 29, 2008
    投稿したはず!なのに、投稿されてませんでした。。。 なので、動作検証も含めてお知らせいたします。 先日のイベントの補足として CTP 版のご案内と注意点を投稿 しましたが、正式版がリリースされました。

  • Anonymous
    February 13, 2008
    ショートノーティスです。 このブログでも何度か取り上げている Visual Studio 2008 用の WDP の日本語版がリリースされました。 ダウンロードは、 こちら からどうぞ。 注意点ですが、サイトに記載されているように、WDP

  • Anonymous
    February 14, 2008
    先日リリースされた WDP の日本語版がリリースされました。 Visual Studio 2008 Web Deployment Projects 日本語版 Your Websites, Our Passion!