プロジェクトに追加のjson configファイルを追加しました
appsettings.DEV.json
appsettings.QA.json
環境に基づいてStartup
関数にロードします:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
...
また、環境を変更する方法を理解しています。プロジェクトプロパティのASPNETCORE_ENVIRONMENT
環境変数の値を変更します。ただし、構成に応じて異なる環境変数を指定する機能はないようです。ドロップダウンリストには「N/A」というラベルが付けられ、無効になっています。
私が見る唯一のオプションは、環境変数の値を手動で変更し、使用するappsettingsを変更することです。自動的にそれを行う方法があると確信していますか、それともCIをどのように使用しますか? (スクリプトを使用して環境変数を変更する以外に、もっと簡単な方法が必要です)。
ここでの目標は、3つの環境(DEV、QA、およびPROD)の自動ビルドと継続的統合をセットアップすることです。DEVとQAは同じマシン上にあるため、環境を手動で指定する環境変数を設定することはオプションではありません。
Tsengsの回答から解決策を見つけましたが、わかりやすくするためにここで説明したいと思います。解決策は別の質問への回答にありますが、質問はかなり異なっています(そして、私も回答を拡大しました)。したがって、この質問は重複としてマークされるべきではないと思います。
答えは here です
解決策は、各IISキーASPNETCORE_ENVIRONMENT
のサイトに異なる環境変数値を設定することです。
その手順は次のとおりです。
Configuration Editor
を選択します。Configuration Editor
を選択しますSection
コンボボックスでsystem.webServer/aspNetCore
(RC2およびRTM)またはsystem.webServer/httpPlatform
(RC1)を選択しますFrom
コンボボックスでApplicationhost.config ...
を選択します。enviromentVariables
要素をクリックして、編集ウィンドウを開きます。または、applicationHost.config
ファイル(通常はC:\Windows\System32\inetsrv\config\applicationHost.config
にある)を変更できます
ルート<Configuration>
タグの下に次のエントリを追加します。ここで、「my-iis-site」はIISサイトの名前です。
<location path="my-iis-site">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
ビルドタイプに基づいてEnvironmentNameを設定する場合は、WebHostBuilder
に便利な.UseEnvironment(environmentName)
があります(プログラムメインにあります)。
プロジェクトのビルド構成に対して適切なコンパイルシンボルが設定されている限り、次のような操作を行ってEnvironmentNameを決定できます。
public static void Main(string[] args)
{
string environmentName;
#if DEBUG
environmentName = "Development";
#Elif STAGING
environmentName = "Staging";
#Elif RELEASE
environmentName = "Production";
#endif
var Host = new WebHostBuilder()
.UseKestrel()
.UseEnvironment(environmentName)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
Host.Run();
}
Program.csでデフォルトのコードを使用している場合、プロジェクトで2つのファイルを作成する以外に何もする必要はありません。
_program.cs
_のデフォルトコードは次のようになります。
_public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
_
code が実際に行っていることは次のとおりです。
_public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder();
...
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
...
return builder;
}
_
したがって、あなたがしなければならないのは_appsettings.YourEnvionronmentalVariable.json
_を作成するだけで、自動的に変換されます。
追加のメモ:2つのファイルを実際にマージするには、次の構文を使用します。
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
ではない:
_var appSettings = new AppSettings();
Configuration.Bind("AppSettings", appSettings);
return appSettings;
_
後者はマージされたデータを返しません。
this のShawn Wildermuthに感謝
Azureを使用している場合は、webappの側のアプリケーション設定にASPNETCORE_ENVIRONMENTを対応する値とともに追加します。これにより、正しいappsettings。{value} .jsonファイルが取得されます
写真でリンクしたダイアログは、「launchSettings.json」を構成するためのものです。このファイルはアプリケーションでは使用されません。
Visual Studioが環境を設定し、F5キーとnothingelseを押したときにブラウザーでURLを開くためにのみ使用されます。
環境を切り替える場合は、起動する前に環境変数を設定する必要があります。これを行う方法は、環境によって異なります。
setx ASPNETCORE_ENVIRONMENT "Development"
$Env:ASPNETCORE_ENVIRONMENT = "Development"
export ASPNETCORE_ENVIRONMENT="Development"
ASPNETCORE_ENVIRONMENT="Development" dotnet run
はい、これはマシン固有です(Linuxはコマンドごとに実行できます)。ただし、IISでは、異なるアプリプールを使用するか、IISに追加するための この回答 の指示に従って、これも実行できます。