Web パッケージ配置のパラメーターを構成する

作成者: Jason Lee

このトピックでは、Web パッケージをリモート IIS Web サーバーに配置するときに、インターネット インフォメーション サービス (IIS) Web アプリケーション名、接続文字列、サービス エンドポイントなどのパラメーター値を設定する方法について説明します。

Web アプリケーション プロジェクトをビルドすると、ビルドとパッケージ化プロセスによって次の 3 つの主要なファイルが生成されます。

  • [プロジェクト名].zip ファイル。 これは、Web アプリケーション プロジェクトの Web 配置パッケージです。 このパッケージには、リモート IIS Web サーバーで Web アプリケーションを再作成するために必要なすべてのアセンブリ、ファイル、データベース スクリプト、リソースが含まれています。
  • [プロジェクト名].deploy.cmd ファイル。 これには、Web 配置パッケージをリモート IIS Web サーバーに発行する一連のパラメーター化された Web 配置 (MSDeploy.exe) コマンドが含まれます。
  • [プロジェクト名].SetParameters.xml ファイル。 これにより、MSDeploy.exe コマンドに一連のパラメーター値が提供されます。 このファイルの値を更新し、Web パッケージを配置するときにコマンド ライン パラメーターとして Web 配置に渡すことができます。

Note

ビルドとパッケージ化のプロセスの詳細については、「Web アプリケーション プロジェクトのビルドとパッケージ化」を参照してください。

SetParameters.xml ファイルは、Web アプリケーション プロジェクト ファイルとプロジェクト内のすべての構成ファイルから動的に生成されます。 プロジェクトをビルドしてパッケージ化すると、Web 発行パイプライン (WPP) によって、配置環境間で変更される可能性が高い多くの変数 (宛先 IIS Web アプリケーションやデータベース接続文字列など) が自動的に検出されます。 これらの値は、Web 配置パッケージで自動的にパラメーター化され、SetParameters.xml ファイルに追加されます。 たとえば、Web アプリケーション プロジェクトの web.config ファイルに接続文字列を追加すると、ビルド プロセスによってこの変更が検出され、それに応じて SetParameters.xml ファイルにエントリが追加されます。

多くの場合、この自動パラメーター化で十分です。 ただし、アプリケーション設定やサービス エンドポイント URL など、ユーザーが配置環境間で他の設定を変更する必要がある場合は、配置パッケージでこれらの値をパラメーター化し、対応するエントリを SetParameters.xml ファイルに追加するように WPP に指示する必要があります。 以下のセクションでは、これを行う方法について説明します。

自動パラメーター化

Web アプリケーションをビルドしてパッケージ化すると、WPP によって次のものが自動的にパラメーター化されます。

  • 宛先 IIS Web アプリケーションのパスと名前。
  • web.config ファイル内のすべての接続文字列。
  • プロジェクト のプロパティ ページの [SQL のパッケージ化/発行] タブに追加するデータベースの接続文字列。

たとえば、パラメーター化プロセスに何も触れずに Contact Manager サンプル ソリューションをビルドしてパッケージ化する場合、WPP はこの ContactManager.Mvc.SetParameters.xml ファイルを生成します。

<parameters>
  <setParameter 
    name="IIS Web Application Name" 
    value="Default Web Site/ContactManager.Mvc_deploy" />  
  <setParameter 
    name="ApplicationServices-Web.config Connection String" 
    value="Data Source=DEVWORKSTATION\SQLEXPRESS;Initial Catalog=CMAppServices;
           Integrated Security=true;" />
</parameters>

この場合、次のようになります。

  • IIS Web アプリケーション名パラメーターは、Web アプリケーションを配置する IIS パスです。 既定値は、プロジェクトのプロパティ ページの [Web のパッケージ化/発行] ページから取得されます。
  • ApplicationServices-Web.config 接続文字列パラメーターは、web.config ファイルの connectionStrings/add 要素から生成されました。 これは、アプリケーションがメンバーシップ データベースへの接続に使用する必要がある接続文字列を表します。 ここで指定した値は、配置された web.config ファイルに置き換えられます。 既定値は、配置前の web.config ファイルから取得されます。

WPP は、生成する配置パッケージ内のこれらのプロパティもパラメーター化します。 配置パッケージをインストールするときに、これらのプロパティの値を指定できます。 「Web パッケージの手動インストール」の説明に従って IIS マネージャーを使用してパッケージを手動でインストールすると、インストール ウィザードによって、パラメーターの値を指定するように求められます。 「Web パッケージの配置」の説明に従って、.deploy.cmd ファイルを使用してパッケージをリモートでインストールする場合、Web 配置はこの SetParameters.xml ファイルを参照してパラメーター値を指定します。 SetParameters.xml ファイル内の値を手動で編集することも、自動ビルドおよび配置プロセスの一環としてファイルをカスタマイズすることもできます。 このプロセスについては、このトピックの後半で詳しく説明します。

カスタム パラメーター化

より複雑な配置シナリオでは、多くの場合、プロジェクトを配置する前に追加のプロパティをパラメーター化する必要があります。 一般に、宛先環境によって異なるプロパティと設定をパラメーター化する必要があります。 次のようなものがあります。

  • web.config ファイル内のサービス エンドポイント。
  • web.config ファイルのアプリケーション設定。
  • ユーザーに指定を求めるその他の宣言型プロパティ。

これらのプロパティをパラメーター化する最も簡単な方法は、web アプリケーション プロジェクトのルート フォルダーに parameters.xml ファイルを追加することです。 たとえば、Contact Manager ソリューションでは、ContactManager.Mvc プロジェクトのルート フォルダーに parameters.xml ファイルが含まれています。

In the Contact Manager solution, the ContactManager.Mvc project includes a parameters.xml file in the root folder.

このファイルを開くと、1 つの パラメーター エントリが含まれていることがわかります。 このエントリでは、XML パス言語 (XPath) クエリを使用して、web.config ファイル内の ContactService Windows Communication Foundation (WCF) サービスのエンドポイント URL を検索してパラメーター化します。

<parameters>
  <parameter name="ContactService Service Endpoint Address"
             description="Specify the endpoint URL for the ContactService WCF 
                          service in the destination environment"
             defaultValue="http://localhost/ContactManagerService">
    <parameterEntry kind="XmlFile" scope="Web.config"
                    match="/configuration/system.serviceModel/client
                           /endpoint[@name='BasicHttpBinding_IContactService']
                           /@address" />
  </parameter>
</parameters>

WPP は、配置パッケージ内のエンドポイント URL のパラメーター化に加えて、配置パッケージと共に生成される SetParameters.xml ファイルに対応するエントリも追加します。

<parameters>
  ...  
  <setParameter 
    name="ContactService Service Endpoint Address" 
    value="http://localhost/ContactManagerService" />
  ...
</parameters>

配置パッケージを手動でインストールすると、IIS マネージャーによって、自動的にパラメーター化されたプロパティと共にサービス エンドポイント アドレスの入力が求められます。 .deploy.cmd ファイルを実行して配置パッケージをインストールする場合は、SetParameters.xml ファイルを編集して、サービス エンドポイント アドレスの値と、自動的にパラメーター化されたプロパティの値を指定できます。

parameters.xml ファイルを作成する方法の詳細については、「方法: パッケージのインストール時にパラメーターを使用して配置設定を構成する」を参照してください。 「Web.config ファイル設定に配置パラメーターを使用するには」という名前の手順に従って、詳細な手順を説明します。

SetParameters.xml ファイルの変更

.deploy.cmd ファイルを実行するか、コマンド ラインから MSDeploy.exe を実行して、Web アプリケーション パッケージを手動で配置する予定の場合は、配置前に SetParameters.xml ファイルを手動で編集する必要はありません。 ただし、エンタープライズ規模のソリューションに取り組んでいる場合は、より大規模で自動化されたビルドおよび配置プロセスの一部として Web アプリケーション パッケージを配置することが必要になる場合があります。 このシナリオでは、SetParameters.xml ファイルを変更するために Microsoft Build Engine (MSBuild) が必要です。 これを行うには、MSBuild XmlPoke タスクを使用します。

Contact Manager サンプル ソリューションは、このプロセスを示しています。 次のコード例は、この例に関連する詳細のみを表示するように編集されています。

Note

サンプル ソリューションのプロジェクト ファイル モデルの概要と、一般的なカスタム プロジェクト ファイルの概要については、「プロジェクト ファイルについて」と「ビルド プロセスについて」を参照してください。

まず、目的のパラメーター値は、環境固有のプロジェクト ファイル (Env-Dev.proj など) のプロパティとして定義されます。

<PropertyGroup> 
  <ContactManagerIisPath Condition=" '$(ContactManagerIisPath)'=='' ">
    DemoSite/ContactManager
  </ContactManagerIisPath>
  <ContactManagerTargetUrl Condition =" '$(ContactManagerTargetUrl)'=='' ">
    http://localhost:85/ContactManagerService/ContactService.svc
  </ContactManagerTargetUrl>
  <MembershipConnectionString Condition=" '$(MembershipConnectionString)'=='' ">
    Data Source=TESTDB1;Integrated Security=true;Initial Catalog=CMAppServices
  </MembershipConnectionString>  
</PropertyGroup>

Note

環境に特化したプロジェクト ファイルを、実際にお使いのサーバー環境に合わせてカスタマイズする方法については、「ターゲット環境の配置プロパティを構成する」のガイダンスを参照してください。

次に、Publish.proj ファイルによってこれらのプロパティがインポートされます。 各 SetParameters.xml ファイルは .deploy.cmd ファイルに関連付けられているため、最終的にはプロジェクト ファイルで各 .deploy.cmd ファイルを呼び出す必要があり、プロジェクト ファイルは各 .deploy.cmd ファイルの MSBuild 項目を作成し、対象のプロパティを項目メタデータとして定義します。

<ItemGroup>
  <PublishPackages Include="$(_ContactManagerDest)ContactManager.Mvc.deploy.cmd"> 
    <ParametersXml>
      $(_ContactManagerDest)ContactManager.Mvc.SetParameters.xml
    </ParametersXml>
    <IisWebAppName>
      $(ContactManagerIisPath)
    </IisWebAppName> 
    <MembershipDBConnectionName>
      ApplicationServices-Web.config Connection String
    </MembershipDBConnectionName>
    <MembershipDBConnectionString>
      $(MembershipConnectionString.Replace(";","%3b"))
    </MembershipDBConnectionString>
    <ServiceEndpointParamName>
      ContactService Service Endpoint Address
    </ServiceEndpointParamName>
    <ServiceEndpointValue>
      $(ContactManagerTargetUrl)
    </ServiceEndpointValue>
  </PublishPackages>
  ...
</ItemGroup>

この場合、次のようになります。

  • ParametersXml メタデータ値は、SetParameters.xml ファイルの場所を示します。
  • IisWebAppName 値は、Web アプリケーションを配置する IIS パスです。
  • MembershipDBConnectionString 値はメンバーシップ データベースの接続文字列であり、MembershipDBConnectionName 値は、SetParameters.xml ファイル内の対応するパラメーターの名前属性です。
  • ServiceEndpointValue 値は宛先サーバー上の WCF サービスのエンドポイント アドレスであり、ServiceEndpointParamName 値は、SetParameters.xml ファイル内の対応するパラメーターの名前属性です。

最後に、Publish.proj ファイルで、PublishWebPackages ターゲットは XmlPoke タスクを使用して、SetParameters.xml ファイル内のこれらの値を変更します。

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter[@name='%(PublishPackages.ConnectionName)']
           /@value"
    Value="%(PublishPackages.ConnectionString)"
    Condition =" '%(PublishPackages.ConnectionName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter
           [@name='%(PublishPackages.MembershipDBConnectionName)']/@value"
    Value='%(PublishPackages.MembershipDBConnectionString)'
    Condition =" '%(PublishPackages.MembershipDBConnectionName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter[@name='IIS Web Application Name']/@value"
    Value="%(PublishPackages.IisWebAppName)"
    Condition =" '%(PublishPackages.IisWebAppName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter
           [@name='%(PublishPackages.ServiceEndpointParamName)']/@value"
    Value="%(PublishPackages.ServiceEndpointValue)"
    Condition =" '%(PublishPackages.ServiceEndpointParamName)'!=''" 
  /> 
  <!--Execute the .deploy.cmd file--> 
  ...
</Target>

XmlPoke タスクでは、次の 4 つの属性値が指定されていることがわかります。

  • XmlInputPath 属性は、変更するファイルを検索する場所をタスクに指示します。
  • Query 属性は、変更する XML ノードを識別する XPath クエリです。
  • Value 属性は、選択した XML ノードに挿入する新しい値です。
  • Condition 属性は、タスクを実行するか実行しないかを示す条件です。 このような場合、この条件により、SetParameters.xml ファイルに null または空の値を挿入しないようにします。

まとめ

このトピックでは、SetParameters.xml ファイルの役割について説明し、Web アプリケーション プロジェクトをビルドするときに生成される方法について説明しました。 プロジェクトに parameters.xml ファイルを追加することで、追加の設定をパラメーター化する方法について説明しました。 また、プロジェクト ファイルで XmlPoke タスクを使用して、より大規模で自動化されたビルド プロセスの一部として、SetParameters.xml ファイルを変更する方法についても説明しました。

次のトピック「Web パッケージの配置」では、.deploy.cmd ファイルを実行するか、MSDeploy.exe コマンドを直接使用して、Web パッケージを配置する方法について説明します。 どちらの場合も、SetParameters.xml ファイルを配置パラメーターとして指定できます。

もっと読む

Web パッケージを作成する方法については、「Web アプリケーション プロジェクトのビルドとパッケージ化」を参照してください。 Web パッケージを実際に配置する方法のガイダンスについては、「Web パッケージの配置」を参照してください。 parameters.xml ファイルを作成する方法の詳細なチュートリアルについては、「方法: パッケージのインストール時にパラメーターを使用して配置設定を構成する」を参照してください。

Web 配置でのパラメーター化の一般的な情報については、「Web Deploy Parameterization in Action」 (ブログ記事) を参照してください。