次の方法で共有


ASP.NET Core アプリを配置するための Visual Studio 発行プロファイル (.pubxml)

Note

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

Warning

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

Important

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

作成者: Sayed Ibrahim HashimiRick Anderson

このドキュメントでは、Visual Studio 2022 以降を使用して 発行プロファイルを作成して使用することに重点を置いています。 Visual Studio を使用して作成した発行プロファイルは、MSBuild および Visual Studio で使用することができます。 Azure に発行する手順については、「Visual Studio を使用して Azure に ASP.NET Core アプリを発行する」を参照してください。

最新および詳細については、次の情報を参照してください。

dotnet new mvc コマンドでは、次のルートレベルの <Project> 要素を含むプロジェクト ファイルが生成されます。

<Project Sdk="Microsoft.NET.Sdk.Web">
    <!-- omitted for brevity -->
</Project>

上の <Project> 要素の Sdk 属性では、MSBuild のプロパティターゲットが、それぞれ $(MSBuildSDKsPath)\Microsoft.NET.Sdk.Web\Sdk\Sdk.props$(MSBuildSDKsPath)\Microsoft.NET.Sdk.Web\Sdk\Sdk.targets からインポートされます。 $(MSBuildSDKsPath) (Visual Studio 2022 を使用) の既定の場所は、\Microsoft Visual Studio\2022\Preview\MSBuild\Sdks フォルダー%programfiles% です。

Microsoft.NET.Sdk.Web(Web SDK) は、Microsoft.NET.Sdk (.NET SDK) や Microsoft.NET.Sdk.Razor (Razor SDK) など、他の SDK に依存します。 依存する各 SDK に関連付けられている MSBuild のプロパティとターゲットがインポートされます。 発行ターゲットでは、使われる発行方法に基づいて、適切なターゲットのセットがインポートされます。

MSBuild または Visual Studio がプロジェクトを読み込むと、次の高レベルのアクションが発生します。

  • Build project
  • 発行するファイルを計算する
  • ターゲットにファイルを発行する

プロジェクト項目を比較する

プロジェクトが読み込まれると、MSBuild プロジェクト項目 (ファイル) が計算されます。 項目の種類によって、ファイルの処理方法が決まります。 規定で、.cs ファイルは、Compile 項目一覧に含まれています。 Compile 項目一覧のファイルがコンパイルされます。

Content 項目一覧には、ビルドの出力に加え、発行されるファイルが含まれています。 既定では、wwwroot\****\*.config**\*.json というパターンに一致するファイルが、Content の項目一覧に含まれます。 たとえば、wwwroot\**glob パターンは、wwwroot フォルダーとそのサブフォルダー内のすべてのファイルと一致します。

Web SDK では、Razor SDK がインポートされます。 その結果、**\*.cshtml および **\*.razor というパターンに一致するファイルが、Content の項目一覧に含まれます。

Web SDK では、Razor SDK がインポートされます。 その結果、**\*.cshtml というパターンに一致するファイルが、Content の項目一覧に含まれます。

発行一覧に明示的にファイルを追加するには、「.csproj」セクションで説明されているように、 ファイルに直接ファイルを追加します。

Visual Studio で [発行] ボタンを選択するか、コマンド ラインから発行すると、以下が実行されます。

  • プロパティ/項目が計算されます (ビルドに必要なファイル)。
  • Visual Studio のみ: NuGet パッケージが復元されます。 (CLI では、ユーザーが明示的に復元する必要があります)。
  • プロジェクトがビルドされます。
  • 発行項目が計算されます (発行に必要なファイル)。
  • プロジェクトが発行されます (計算されたファイルが発行先にコピーされます)。

ASP.NET Core プロジェクトでプロジェクト ファイルの Microsoft.NET.Sdk.Web が参照される場合、app_offline.htm ファイルは、Web アプリのディレクトリのルートに配置されます。 ファイルが存在する場合、ASP.NET Core モジュールはアプリを正常にシャットダウンし、展開中に app_offline.htm ファイルを提供します。 詳細については、「ASP.NET Core モジュール構成リファレンス」を参照してください。

基本的なコマンド ラインからの発行

コマンド ライン発行は、すべてで動作します。NET でサポートされるプラットフォーム。Visual Studio は必要ありません。 次の例では、プロジェクト ディレクトリ ( ファイルが含まれているディレクトリ) から .NET CLI の .csproj コマンドが実行されます。 プロジェクト フォルダーが現在の作業ディレクトリでない場合は、プロジェクト ファイルのパスで明示的に渡します。 For example:

dotnet publish C:\Webs\Web1

Web アプリを作成して発行するには、次のコマンドを実行します。

dotnet new mvc
dotnet publish

dotnet publish コマンドでは次のような出力が生成されます。

C:\Webs\Web1>dotnet publish
Restore complete (0.4s)
  Web1 succeeded (9.2s) → bin\Release\net9.0\publish\

既定の発行フォルダー形式は bin\Debug\{TARGET FRAMEWORK MONIKER}。 たとえば、bin\Release\net9.0\ のように指定します。

次のコマンドでは、Release ビルドと発行ディレクトリを指定します。

dotnet publish -c Release -o C:\MyWebs\test

dotnet publish コマンドは、Publish ターゲットを呼び出す MSBuild を呼び出します。 dotnet publish に渡されたすべてのパラメーターが MSBuild に渡されます。 -c-o のパラメーターは、それぞれ MSBuild の ConfigurationOutputPath にマップします。

MSBuild プロパティ は、次のいずれかの形式を使用して渡すことができます。

  • -p:<NAME>=<VALUE>
  • /p:<NAME>=<VALUE>

たとえば、次のコマンドは、Release ビルドをネットワーク共有に発行します。 ネットワーク共有はスラッシュ (r8/) で指定され、サポートされているすべての .NET プラットフォームで動作します。

dotnet publish -c Release /p:PublishDir=//r8/release/AdminWeb

配置用に発行したアプリが実行されていないことを確認します。 アプリが実行中は、publish フォルダー内のファイルがロックされます。 ロックされているファイルはコピーできないため、配置は行われません。

詳細については、 Microsoft.NET.Sdk.Publish readme ファイルを参照してください。

Publish profiles

このセクションでは、Visual Studio 2022 以降を使用して発行プロファイルを作成します。 プロファイルが作成されると、Visual Studio またはコマンド ラインから発行できるようになります。 発行プロファイルは発行プロセスを簡略化でき、任意の数のプロファイルが存在できます。

次のいずれかの方法で、Visual Studio で発行プロファイルを作成します。

  • ソリューション エクスプローラーで、プロジェクトを右クリックして [発行] をクリックします。
  • [ビルド] メニューの [{PROJECT NAME} の発行] を選択します。

アプリ機能ページの [発行] タブが表示されます。 次のような複数の発行ターゲットを使用できます。

  • Azure
  • Docker Container Registry
  • Folder
  • (任意の Web サーバーの) IIS、FTP、Web 配置
  • Import Profile

最も適切な発行先を決定するには、自分に合った発行オプションに関する記事を参照してください。

発行先を [フォルダー] に選択した場合は、発行された資産を保存するフォルダーのパスを指定します。 既定のフォルダー パスは、bin\{PROJECT CONFIGURATION}\{TARGET FRAMEWORK MONIKER}\publish\ です。 たとえば、bin\Release\netcoreapp2.2\publish\ になります。 [プロファイルの作成] ボタンを選択して完了します。

発行プロファイルが作成されると、 [発行] タブの内容が変化します。 新しく作成したプロファイルがドロップダウン リストに表示されます。 別の新しいプロファイルを作成するには、ドロップダウン リストから [新しいプロファイルの作成] を選択します。

Visual Studio の発行ツールは、発行プロファイルを記述する Properties/PublishProfiles/{PROFILE NAME}.pubxml MSBuild ファイルを生成します。 .pubxml ファイルは:

  • 発行構成の設定を含み、発行プロセスによって使用されます。
  • 変更して、ビルドと発行プロセスをカスタマイズできます。

Azure ターゲットに発行する場合、 .pubxml ファイルは次のようになります。

  • Azure サブスクリプション識別子が含まれています。
  • サブスクリプション識別子は機密情報であるため、ソース管理にチェックインしないでください。

公開パスワードなどの機密情報は、ユーザー/コンピューター レベルで暗号化されます。 Properties/PublishProfiles/{PROFILE NAME}.pubxml.user ファイルには、ユーザー名とパスワードを取得するために MSBuild で必要な情報が含まれています。

ASP.NET Core Web アプリを発行する方法の概要については、「ASP.NET Core のホストと展開」を参照してください。 ASP.NET Core Web アプリを発行するために必要な MSBuild タスクとターゲットはオープン ソースであり、dotnet/websdk リポジトリにあります。

dotnet publishdotnet build:

  • フォルダー、MSDeploy、および Kudu 発行プロファイルを使用できます。 MSDeploy にはクロスプラットフォームのサポートがないため、MSDeploy オプションは Windows でのみサポートされます。
  • 任意のプラットフォームから Azure に発行する Kudu API をサポートします。 Visual Studio の発行は、Kudu API をサポートしていますが、Azure へのクロスプラットフォームの発行は WebSDK がサポートしています。

DeployOnBuild コマンドに dotnet publish を渡さないでください。

詳細については、「Microsoft.NET.Sdk.Publish」を参照してください。

フォルダーの発行の例

FolderProfileという名前のプロファイルを使用して発行する場合は、次のいずれかのコマンドを使用します。

dotnet publish /p:Configuration=Release /p:PublishProfile=FolderProfile
dotnet build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile
msbuild /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

.NET CLI の dotnet build コマンドにより msbuild が呼び出されて、ビルドと発行プロセスが実行されます。 dotnet buildmsbuild のコマンドは、フォルダー プロファイルで渡す場合は同等です。 Windows で msbuild を直接呼び出すと、MSBuild の .NET Framework バージョンが使用されます。 フォルダー以外のプロファイルで dotnet build を呼び出すと:

  • MSDeploy を使用する msbuild が呼び出されます。
  • 失敗します (Windows で実行されている場合でも)。 フォルダー以外のプロファイルで発行するには、msbuild を直接呼び出します。

次のフォルダー発行プロファイルは、Visual Studio で作成され、ネットワーク共有に発行されます。

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
  <PropertyGroup>
    <DeleteExistingFiles>false</DeleteExistingFiles>
    <ExcludeApp_Data>false</ExcludeApp_Data>
    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <PublishProvider>FileSystem</PublishProvider>
    <PublishUrl>\\r8\Release\AdminWeb</PublishUrl>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <_TargetId>Folder</_TargetId>
  </PropertyGroup>
</Project>

前の例の場合:

  • <ExcludeApp_Data> プロパティは、XML スキーマ要件を満たすために存在します。 プロジェクトのルートに <ExcludeApp_Data> フォルダーがある場合でも、 プロパティが発行プロセスに影響することはありません。 App_Data フォルダーは ASP.NET 4.x プロジェクトのように特別な処理を受信しません。
  • <LastUsedBuildConfiguration> プロパティが Release に設定されている。 Visual Studio から発行すると、発行プロセスが開始されたときの値を使用して、<LastUsedBuildConfiguration> の値が設定されます。 <LastUsedBuildConfiguration> は特殊なので、インポートされる MSBuild ファイルでオーバーライドされないようにしてください。 ただし、このプロパティは次の方法のいずれかを使用してコマンドラインからオーバーライドすることができます。
    • .NET CLI の使用

      dotnet publish /p:Configuration=Release /p:PublishProfile=FolderProfile
      
      dotnet build -c Release /p:DeployOnBuild=true /p:PublishProfile=FolderProfile
      
    • Using MSBuild:

      msbuild /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=FolderProfile
      

コマンド ラインから MSDeploy エンドポイントに発行する

See Microsoft.NET.Sdk.Publish.

環境を設定する

発行プロファイル ( <EnvironmentName>) またはプロジェクト ファイルに プロパティを追加し、アプリの環境を設定します。

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

web.config の変換が必要な場合 (たとえば、構成、プロファイル、または環境に基づいて環境変数を設定する場合) は、「web.config を変換する」を参照してください。

Exclude files

ASP.NET Core Web アプリを発行するときは、次の資産が含まれます。

  • Build artifacts
  • 次の glob パターンと一致するフォルダーおよびファイル:
    • **\*.config (例: web.config)
    • **\*.json (例: appsettings.json)
    • wwwroot\**

MSBuild では、glob パターンがサポートされています。 たとえば、次の <Content> 要素では、wwwroot/content フォルダーとそのサブフォルダー内にあるテキスト ( .txt) ファイルのコピーが抑制されます。

<ItemGroup>
  <Content Update="wwwroot/content/**/*.txt" CopyToPublishDirectory="Never" />
</ItemGroup>

上記のマークアップは、発行プロファイルまたは .csproj ファイルに追加できます。 .csproj ファイルに追加すると、プロジェクト内のすべての発行プロファイルにルールが追加されます。

次の <MsDeploySkipRules> 要素では、wwwroot\content フォルダーのすべてのファイルが除外されます。

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFolder">
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath>wwwroot\\content</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

<MsDeploySkipRules> は、"スキップされる" ターゲットを配置サイトから削除しません。 <Content> のターゲットであるファイルとフォルダーは、配置サイトから削除されます。 たとえば、配置される Web アプリに次のファイルが含まれているとします。

  • Views/Home/About1.cshtml
  • Views/Home/About2.cshtml
  • Views/Home/About3.cshtml

次の <MsDeploySkipRules> 要素を追加した場合、これらのファイルは配置サイトでは削除されません。

<ItemGroup>
  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath>Views\\Home\\About1.cshtml</AbsolutePath>
  </MsDeploySkipRules>

  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath>Views\\Home\\About2.cshtml</AbsolutePath>
  </MsDeploySkipRules>

  <MsDeploySkipRules Include="CustomSkipFile">
    <ObjectName>filePath</ObjectName>
    <AbsolutePath>Views\\Home\\About3.cshtml</AbsolutePath>
  </MsDeploySkipRules>
</ItemGroup>

前述の <MsDeploySkipRules> 要素は、"スキップされる" ファイルが配置されないようにします。 それは、いったん配置されたファイルは削除しません。

次の <Content> 要素は、配置サイトのターゲット ファイルを削除します。

<ItemGroup>
  <Content Update="Views/Home/About?.cshtml" CopyToPublishDirectory="Never" />
</ItemGroup>

前述の <Content> 要素を使用してコマンド ライン配置を行うと、次のような出力が生成されます。

MSDeployPublish:
  Starting Web deployment task from source: manifest(C:\Webs\Web1\obj\Release\{TARGET FRAMEWORK MONIKER}\PubTmp\Web1.SourceManifest.
  xml) to Destination: auto().
  Deleting file (Web11112\Views\Home\About1.cshtml).
  Deleting file (Web11112\Views\Home\About2.cshtml).
  Deleting file (Web11112\Views\Home\About3.cshtml).
  Updating file (Web11112\web.config).
  Updating file (Web11112\Web1.deps.json).
  Updating file (Web11112\Web1.dll).
  Updating file (Web11112\Web1.pdb).
  Updating file (Web11112\Web1.runtimeconfig.json).
  Successfully executed Web deployment task.
  Publish Succeeded.
Done Building Project "C:\Webs\Web1\Web1.csproj" (default targets).

Include files

次のセクションでは、発行時のファイル インクルードのさまざまな方法を概説します。 「一般的なファイル インクルード」のセクションでは、DotNetPublishFiles の発行先ファイルから提供される 項目を使用します。 選択的ファイルインクルード セクションでは、.NET SDK の発行ターゲット ファイルによって提供されるResolvedFileToPublish項目を使用します。 Web SDK は .NET SDK に依存しているため、どちらの項目も ASP.NET Core プロジェクトで使用できます。

一般的なファイル インクルード

次の例の <ItemGroup> 要素は、プロジェクト ディレクトリの外部にあるフォルダーを発行済みサイトのフォルダーにコピーする方法を示しています。 次のマークアップの <ItemGroup> に追加されたすべてのファイルが既定で含まれます。

<ItemGroup>
  <_CustomFiles Include="$(MSBuildProjectDirectory)/../images/**/*" />
  <DotNetPublishFiles Include="@(_CustomFiles)">
    <DestinationRelativePath>wwwroot/images/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
  </DotNetPublishFiles>
</ItemGroup>

上のマークアップでは以下の操作が行われます。

  • .csproj ファイルまたは発行プロファイルに追加できます。 .csproj ファイルに追加した場合は、プロジェクトの各発行プロファイルに含まれます。
  • _CustomFiles 属性の glob パターンに一致するファイルを格納するための Include 項目を宣言します。 パターンで参照されるイメージ フォルダーはプロジェクト ディレクトリの外部にあります。 という名前の$(MSBuildProjectDirectory)がプロジェクト ファイルの絶対パスを解決します。
  • DotNetPublishFiles 項目にファイルの一覧を提供します。 既定では、項目の <DestinationRelativePath> 要素は空です。 既定値はマークアップでオーバーライドされ、 などの%(RecursiveDir)を使用します。 内部のテキストは、発行済みサイトの wwwroot/images フォルダーを表します。

選択的なファイル インクルード

次の例の強調表示されたマークアップは、次のことを示しています。

  • プロジェクトの外部にあるファイルは、発行済みのサイトの wwwroot フォルダーにコピーされます。 ReadMe2.md のファイル名は維持されます。
  • wwwroot\Content フォルダーは除外されます。
  • Views\Home\About2.cshtml は除外されます。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <PublishProvider>FileSystem</PublishProvider>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <PublishFramework />
    <ProjectGuid>
      <GUID Here=""></GUID>
    </ProjectGuid>
    <publishUrl>bin\Release\PublishOutput</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
  </PropertyGroup>
  <ItemGroup>
    <ResolvedFileToPublish Include="..\ReadMe2.md">
      <RelativePath>wwwroot\ReadMe2.md</RelativePath>
    </ResolvedFileToPublish>

    <Content Update="wwwroot\Content\**\*" CopyToPublishDirectory="Never" />
    <Content Update="Views\Home\About2.cshtml" CopyToPublishDirectory="Never" />
  </ItemGroup>
</Project>

上記の例では、既定の動作として ResolvedFileToPublish 属性に提供されたファイルが常に発行済みサイトにコピーされる、Include 項目を使用します。 既定の動作は、内部テキストが <CopyToPublishDirectory> または Never の子要素 PreserveNewest を含めるとオーバーライドされます。 For example:

<ResolvedFileToPublish Include="..\ReadMe2.md">
  <RelativePath>wwwroot\ReadMe2.md</RelativePath>
  <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>

他の配置例については、Web SDK の README ファイルを参照してください。

発行の前または後にターゲットを実行する

組み込みの BeforePublishAfterPublish ターゲットは、ターゲットの発行前または後にターゲットを実行できます。 発行の前と後の両方でコンソール メッセージをログに記録するには、発行プロファイルに次の要素を追加します。

<?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>
  <PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
    <ResourceId>/subscriptions/SomeGuid/resourcegroups/TP_RG/providers/Microsoft.Web/sites/TP22</ResourceId>
    <ResourceGroup>TP_RG</ResourceGroup>
    <PublishProvider>AzureWebSite</PublishProvider>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish>https://tp22.azurewebsites.net</SiteUrlToLaunchAfterPublish>
    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
    <ExcludeApp_Data>false</ExcludeApp_Data>
    <ProjectGuid>GuidHere</ProjectGuid>
    <MSDeployServiceURL>something.scm.azurewebsites.net:443</MSDeployServiceURL>
    <DeployIisAppPath>myDeploysIISpath</DeployIisAppPath>
    <RemoteSitePhysicalPath />
    <SkipExtraFilesOnServer>true</SkipExtraFilesOnServer>
    <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
    <EnableMSDeployBackup>true</EnableMSDeployBackup>
    <EnableMsDeployAppOffline>true</EnableMsDeployAppOffline>
    <UserName />
    <_SavePWD>false</_SavePWD>
    <_DestinationType>AzureWebSite</_DestinationType>
    <InstallAspNetCoreSiteExtension>false</InstallAspNetCoreSiteExtension>
  </PropertyGroup>
    <Target Name="CustomActionsBeforePublish" BeforeTargets="BeforePublish">
        <Message Text="Inside BeforePublish" Importance="high" />
    </Target>
    <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
        <Message Text="Inside AfterPublish" Importance="high" />
    </Target>
</Project>

信頼されていない証明書を使用してサーバーに発行する

値が <AllowUntrustedCertificate>True プロパティを発行プロファイルに追加します。

<PropertyGroup>
  <AllowUntrustedCertificate>True</AllowUntrustedCertificate>
</PropertyGroup>

Kudu サービス

Azure App Service での Web アプリのデプロイに含まれるファイルを表示するには、Kudu サービス を使用します。 scm トークンを Web アプリ名に追加します。 For example:

URL Result
http://mysite.azurewebsites.net/ Web App
http://mysite.scm.azurewebsites.net/ Kudu service

ファイルの表示、編集、削除、追加を行うには、[デバッグ コンソール] メニュー項目を選択します。

Additional resources