ASP.NET Coreアプリケーション(Web Api)があります。ドキュメントでは 複数の環境で動作する を説明していますが、Webサイトを公開するときにaspnetcore_environment
を設定する方法を説明できませんでした。
3つの環境Development
、Staging
およびProduction
がある場合、
従来のASP.NET Webアプリケーションでは、3つのビルド構成を作成するために使用していました。 Development
、Staging
、およびProduction
(下図のように)。次に、3つの.pubxml
ファイル(構成ごとに1つ)。 ASP.NET Core
アプリケーションにも同じアプローチを使用する必要がありますか?
aspnetcore_environment
ファイルに.pubxml
を設定するにはどうすればよいですか?
質問1で指定されたアプローチが廃止された場合、代替アプローチは何ですか? (私はCIにJenkinsを使用しています)
アップデート1
ASPNETCORE_ENVIRONMENT
を設定する必要があることは理解していますが、これをどこで設定するのか理解できませんか?開発中にlaunchSettings.json
のプロファイルでこれを設定できますが、ステージングまたはプロダクションに公開するときにこれをどのように設定すればよいのでしょうか?ターゲットサーバー自体に環境変数を設定しますか?
更新2
環境変数を設定するさまざまな方法を説明する記事 here を見つけました。これは私の質問に部分的に答えました。ただし、アプリケーションを公開すると、公開プロセスはappsettings.{env.EnvironmentName}.json
の公開中に環境変数を尊重しません。
別の post を質問用に作成しました
IISでアプリケーションをホストする場合、web.configで環境変数を設定できます。
https://docs.Microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
パブリッシュ時に生成するには、web.configをプロジェクトのルートに追加します。「dotnet publish」は、パブリッシュフォルダーで生成されるファイルのベースとしてこのファイルを使用します。その後、展開システムの値を変更できます。
<?xml version="1.0" encoding="utf-8" ?>
<!-- Used to overwrite settings web.config generated by "dotnet publish", Only used when hosting under IIS -->
<configuration>
<system.webServer>
<aspNetCore stdoutLogEnabled="true">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
以下を使用して、目的のASPNETCORE_ENVIRONMENTを引数としてdotnet publishコマンドに渡すことができます。
/p:EnvironmentName=Staging
例えばdotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
これにより、プロジェクトに指定された正しい環境でweb.configが生成されます。
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
同じ要件があり、次の解決策を思いつきました。これは、自動展開でうまく機能し、構成の変更が少なくて済みます。
1。プロジェクトファイル(.CsProj)ファイルの変更
MSBuildはEnvironmentName
プロパティをサポートしています。これは、展開する環境に応じて適切な環境変数を設定するのに役立ちます。環境名は、発行段階でweb.configに追加されます。
プロジェクトファイル(* .csProj)を開き、次のXMLを追加するだけです。
<!-- Custom Property Group added to add the Environment name during publish
The EnvironmentName property is used during the publish for the Environment variable in web.config
-->
<PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
<EnvironmentName>'$(Configuration)'</EnvironmentName>
</PropertyGroup>
上記のコードは、環境名を空の場合はDevelopment
またはDebug
構成として追加します。その他の構成の場合、選択された構成から環境名が選択されます。これにより、ASPNETCORE_ENVIRONMENT
環境が目的の構成で追加されます。 CsProjファイルを更新することにより、必要に応じて環境名のロジックを変更できます。詳細 ここ
2。パブリッシュプロファイルにEnvironmentNameプロパティを追加します。
<EnvironmentName>
プロパティを発行プロファイルに追加することもできます。 Properties/PublishProfiles/{profilename.pubxml}
にある公開プロファイルファイルを開きます。これにより、プロジェクトの公開時にweb.configで環境名が設定されます。詳細 こちら
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
上の図に示すように、環境を各構成に追加し、EnvironmentName
プロパティの名前を各* .pubxmlファイルで変更できます。
3。 dotnet publishを使用したコマンドラインオプション
さらに、プロパティEnvironmentName
をコマンドラインオプションとしてdotnet publish
コマンドに渡すことができます。次のコマンドは、web.configファイルにDevelopment
として環境変数を含めます。
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
2つ以上のプロファイルを設定するには、追加のプロファイルを作成する必要があります。 リンクされた記事に記載 で、launchSettings.json
には配列が含まれます。
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
環境変数を読み取るには、 起動時に指定するand追加メソッドAddEnvironmentVariables
を呼び出す必要があります。変数へのアクションを実行します。
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
// general properties
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
// specify the environment-based properties
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// do not forget to add environment variables to your config!
.AddEnvironmentVariables();
Configuration = builder.Build();
}
}
パブリッシュプロファイルではできないと思います。環境変数を設定する必要があります。 ASPNETCORE_ENVIRONMENT =ステージング。 AzureのaspnetコアWebアプリでも同様のことをしなければなりませんでした。開発、ステージング、およびプロダクションが必要でした。私がやった方法は、まさにenv変数でした。