Visual Studio を使用した ASP.NET Web 配置: 追加ファイルの配置

著者: Tom Dykstra

スターター プロジェクトのダウンロード

このチュートリアル シリーズでは、Visual Studio 2012 または Visual Studio 2010 を使用して、ASP.NET Web アプリケーションを Azure App Service Web Apps またはサードパーティのホスティング プロバイダーに配置 (発行) する方法について説明します。 このシリーズについては、シリーズの最初のチュートリアルをご覧ください。

概要

このチュートリアルでは、Visual Studio Web 発行パイプラインを拡張して、配置中に追加のタスクを行う方法について説明します。 このタスクとは、プロジェクト フォルダーに含まれていない追加のファイルを配置先の Web サイトにコピーすることです。

このチュートリアルでは、1 つの追加ファイル robots.txt をコピーします。 このファイルは、ステージングには配置しますが、運用環境には配置しません。 「運用環境に配置する」チュートリアルでは、このファイルをプロジェクトに追加し、それを除外するよう運用発行プロファイルを構成しました。 このチュートリアルでは、この状況を処理する別の方法について説明します。これは、配置はしたいがプロジェクトには含めたくない、あらゆるファイルに対して有用です。

robots.txt ファイルを移動する

robots.txt を処理する別の方法を準備するため、チュートリアルのこのセクションでは、プロジェクトに含まれていないフォルダーにこのファイルを移動し、ステージング環境から robots.txt を削除します。 その環境にファイルを配置する新しい方法が正しく動作していることを確認できるように、ステージングからファイルを削除する必要があります。

  1. ソリューション エクスプローラーで、robots.txt ファイルを右クリックし、[プロジェクトから除外する] をクリックします。

  2. Windows エクスプローラーを使用して、ソリューション フォルダーに新しいフォルダーを作成し、ExtraFiles という名前を付けます。

  3. robots.txt ファイルを、ContosoUniversity プロジェクト フォルダーから ExtraFiles フォルダーに移動します。

    ExtraFiles folder

  4. FTP ツールを使用して、ステージング Web サイトから robots.txt ファイルを削除します。

    別の方法として、ステージング発行プロファイルの [設定] タブにある [ファイル公開オプション] の下の [発行先の追加ファイルを削除する] を選択し、ステージングに再発行することもできます。

発行プロファイル ファイルを更新する

ステージングには robots.txt だけが必要なため、その配置のために更新する必要がある発行プロファイルはステージングのみです。

  1. Visual Studio で、Staging.pubxml を開きます。

  2. ファイル末尾の </Project> 終了タグの前に、以下のマークアップを追加します。

    <Target Name="CustomCollectFiles">
        <ItemGroup>
          <_CustomFiles Include="..\ExtraFiles\**\*" />
          <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
          </FilesForPackagingFromProject>
        </ItemGroup>
      </Target>
    

    このコードによって、配置する追加のファイルを収集する新しい "ターゲット" が作成されます。 ターゲットは、指定した条件に基づき MSBuild によって実行される 1 つ以上のタスクで構成されます。

    Include 属性は、ファイルの検索を行う対象であるフォルダーが、プロジェクト フォルダーと同じレベルにある ExtraFiles であることを指定します。 MSBuild は、そのフォルダーおよびその他のあらゆるサブフォルダーからすべてのファイルを再帰的に収集します (二重アスタリスクが再帰的なサブフォルダーを指定しています)。 このコードにより、複数のファイルおよびサブフォルダー内のファイルを ExtraFiles フォルダーに入れることができ、そのすべてが配置されます。

    DestinationRelativePath 要素は、フォルダーとファイルが、ExtraFiles フォルダー内にあるのと同じファイルおよびフォルダー構造のまま、配置先 Web サイトのルート フォルダーにコピーされることを指定します。 ExtraFiles フォルダー自体をコピーする場合は、DestinationRelativePath の値は ExtraFiles\%(RecursiveDir)%(Filename)%(Extension) になります。

  3. ファイル末尾の </Project> 終了タグの前に、新しいターゲットの実行タイミングを指定する次のマークアップを追加します。

    <PropertyGroup>
        <CopyAllFilesToSingleFolderForPackageDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForPackageDependsOn);
        </CopyAllFilesToSingleFolderForPackageDependsOn>
    
        <CopyAllFilesToSingleFolderForMsdeployDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
        </CopyAllFilesToSingleFolderForMsdeployDependsOn>
    </PropertyGroup>
    

    このコードにより、ファイルを配置先フォルダーにコピーするターゲットが実行されるたびに、新しい CustomCollectFiles ターゲットが実行されます。 発行と配置パッケージの作成には別のターゲットがあり、発行ではなく配置パッケージを使用して配置する場合は、両方のターゲットに新しいターゲットが挿入されます。

    .pubxml ファイルは、以下の例のようになります。

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    This file is used by the publish/package process of your Web project. You can customize the behavior of this process
    by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121. 
    -->
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish>http://contosou-staging.azurewebsites.net</SiteUrlToLaunchAfterPublish>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <MSDeployServiceURL>waws-prod-bay-001.publish.azurewebsites.windows.net:443</MSDeployServiceURL>
        <DeployIisAppPath>contosou-staging</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
        <UserName>$contosou-staging</UserName>
        <_SavePWD>True</_SavePWD>
        <PublishDatabaseSettings>
          <Objects xmlns="">
            <ObjectGroup Name="SchoolContext" Order="1" Enabled="True">
              <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" />
              <Object Type="DbCodeFirst">
                <Source Path="DBMigration" DbContext="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" MigrationConfiguration="ContosoUniversity.DAL.Migrations.Configuration, ContosoUniversity.DAL" Origin="Configuration" />
              </Object>
            </ObjectGroup>
            <ObjectGroup Name="DefaultConnection" Order="2" Enabled="False">
              <Destination Path="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User ID=CU-staging-admin@sk0264hvc9;Password=" Name="Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=" />
              <Object Type="DbDacFx">
                <PreSource Path="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True" includeData="False" />
                <Source Path="$(IntermediateOutputPath)AutoScripts\DefaultConnection_IncrementalSchemaOnly.dacpac" dacpacAction="Deploy" />
              </Object>
              <UpdateFrom Type="Web.Config">
                <Source MatchValue="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;Initial Catalog=aspnet-ContosoUniversity;AttachDBFilename=|DataDirectory|\aspnet-ContosoUniversity.mdf" MatchAttributes="$(UpdateFromConnectionStringAttributes)" />
              </UpdateFrom>
              <Object Type="DbFullSql" Enabled="False">
                <Source Path="..\aspnet-data-prod.sql" Transacted="False" />
              </Object>
            </ObjectGroup>
          </Objects>
        </PublishDatabaseSettings>
        <EnableMSDeployBackup>False</EnableMSDeployBackup>
      </PropertyGroup>
      <ItemGroup>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)DefaultConnection-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)SchoolContext-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
      </ItemGroup>
      <Target Name="CustomCollectFiles">
        <ItemGroup>
          <_CustomFiles Include="..\ExtraFiles\**\*" />
          <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
          </FilesForPackagingFromProject>
        </ItemGroup>
      </Target>
      <PropertyGroup>
        <CopyAllFilesToSingleFolderForPackageDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForPackageDependsOn);
        </CopyAllFilesToSingleFolderForPackageDependsOn>
    
        <CopyAllFilesToSingleFolderForMsdeployDependsOn>
          CustomCollectFiles;
          $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
        </CopyAllFilesToSingleFolderForMsdeployDependsOn>
      </PropertyGroup>
    </Project>
    
  4. Staging.pubxml ファイルを保存して閉じます。

ステージングに発行する

ワンクリック発行またはコマンド ラインを使用して、ステージング プロファイルを使用してアプリケーションを発行します。

ワンクリック発行を使用する場合は、[プレビュー] ウィンドウで、robots.txt がコピーされることを確認できます。 それ以外の場合は、FTP ツールを使用して、配置後に robots.txt ファイルが Web サイトのルート フォルダーにあることを確認します。

まとめ

これで、サードパーティのホスティング プロバイダーに ASP.NET Web アプリケーションを配置する方法に関するこの一連のチュートリアルが完了しました。 これらのチュートリアルで説明されているトピックの詳細については、「ASP.NET 配置のコンテンツ マップ」を参照してください。

詳細

MSBuild ファイルの操作方法がわかっている場合は、.pubxml ファイル (プロファイル固有のタスクの場合) またはプロジェクトの .wpp.targets ファイル (すべてのプロファイルに適用されるタスクの場合) にコードを書き込むことで、他の多くの配置タスクを自動化できます。 .pubxml ファイルおよび .wpp.targets ファイルの詳細については、「方法: Visual Studio Web プロジェクトで、発行プロファイル (.pubxml) ファイルおよび .wpp.targets ファイルの配置設定を編集する」を参照してください。 MSBuild コードの基本的な概要については、「エンタープライズ配置シリーズ: プロジェクト ファイルについて理解する」の「プロジェクト ファイルの構造」を参照してください。 MSBuild ファイルを操作して独自のシナリオのタスクを実行する方法については、書籍『Inside the Microsoft Build Engine: Using MSBuild and Team Foundation Build』 (Sayed Ibrahim Hashimi、William Bartholomew 共著) を参照してください。

確認

このチュートリアル シリーズのコンテンツに多大な貢献を果たした次の方々に感謝を捧げます。