Saya telah menetapkan beberapa nilai dalam saya appsettings.json
untuk hal-hal seperti string koneksi database, lokasi webapi dan sejenisnya yang berbeda untuk pengembangan, pementasan, dan lingkungan langsung.
Apakah ada cara untuk memiliki banyak appsettings.json
file (seperti appsettings.live.json
, dll, dll) dan membuat aplikasi asp.net hanya 'tahu' mana yang akan digunakan berdasarkan konfigurasi build yang dijalankannya?
c#
asp.net-core
appsettings
tweetypi
sumber
sumber
Saya telah menambahkan tangkapan layar dari lingkungan kerja, karena saya menghabiskan beberapa jam untuk R&D.
Pertama, tambahkan kunci ke
launch.json
file Anda .Lihat tangkapan layar di bawah ini, saya telah menambahkan
Development
sebagai lingkungan saya.Kemudian, dalam proyek Anda, buat
appsettings.{environment}.json
file baru yang menyertakan nama lingkungan.Di tangkapan layar berikut, cari dua file berbeda dengan nama:
appsettings.Development.Json
appSetting.json
Dan terakhir, konfigurasikan ke
StartUp
kelas Anda seperti ini: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) .AddEnvironmentVariables(); Configuration = builder.Build(); }
Dan akhirnya, Anda dapat menjalankannya dari baris perintah seperti ini:
dotnet run --environment "Development"
dimana
"Development"
nama lingkungan saya.sumber
IWebHostEnvironment
sebagai gantinya.Pembaruan untuk .NET Core 3.0+
Anda dapat menggunakan
CreateDefaultBuilder
yang secara otomatis akan membangun dan meneruskan objek konfigurasi ke kelas startup Anda:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
otomatis menyertakan file yang sesuai, jadi tambahkan file setelan aplikasi terpisah untuk setiap lingkungan:appsettings.Environment.json
Kemudian atur
ASPNETCORE_ENVIRONMENT
variabel lingkungan saat menjalankan / debuggingCara mengatur Variabel Lingkungan
Bergantung pada IDE Anda, ada beberapa tempat proyek dotnet biasanya mencari variabel lingkungan:
Untuk Visual Studio masuk ke Project> Properties> Debug> Environment Variables:
Untuk kode Visual Studio , edit
.vscode/launch.json
>env
:Menggunakan Pengaturan Peluncuran , edit
Properties/launchSettings.json
>environmentVariables
:Yang juga dapat dipilih dari Toolbar di Visual Studio
Menggunakan dotnet CLI , gunakan sintaks yang sesuai untuk mengatur variabel lingkungan per OS Anda
Bagaimana cara
Host.CreateDefaultBuilder
kerjanya?.NET Core 3.0 ditambahkan di
Host.CreateDefaultBuilder
bawah ekstensi platform yang akan memberikan inisialisasi defaultIConfiguration
yang menyediakan konfigurasi default untuk aplikasi dalam urutan berikut:Bacaan Lebih Lanjut - MS Docs
sumber
Di ASP.NET Core, Anda sebaiknya menggunakan Variabel Lingkungan daripada membangun konfigurasi untuk appsettings.json yang tepat
Klik kanan pada proyek Anda> Properti> Debug> Variabel Lingkungan
ASP.NET Core akan menggunakan file appsettings.json yang sesuai:
Sekarang Anda dapat menggunakan Variabel Lingkungan seperti ini:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
sumber
Anda dapat menggunakan variabel lingkungan dan
ConfigurationBuilder
kelas dalamStartup
konstruktor Anda seperti ini:public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); this.configuration = builder.Build(); }
Kemudian Anda membuat
appsettings.xxx.json
file untuk setiap lingkungan yang Anda butuhkan, dengan "xxx" sebagai nama lingkungan. Perhatikan bahwa Anda dapat memasukkan semua nilai konfigurasi global dalamappsettings.json
file "normal" Anda dan hanya memasukkan hal-hal khusus lingkungan ke dalam file baru ini.Sekarang Anda hanya membutuhkan variabel lingkungan yang dipanggil
ASPNETCORE_ENVIRONMENT
dengan beberapa nilai lingkungan tertentu ("live", "staging", "production", apa pun). Anda dapat menentukan variabel ini di setelan proyek Anda untuk lingkungan pengembangan Anda, dan tentu saja Anda perlu menyetelnya di lingkungan pementasan dan produksi Anda juga. Cara Anda melakukannya tergantung pada jenis lingkungannya.UPDATE: Saya baru menyadari Anda ingin memilih
appsettings.xxx.json
berdasarkan konfigurasi build Anda saat ini . Ini tidak dapat dicapai dengan solusi yang saya usulkan dan saya tidak tahu apakah ada cara untuk melakukan ini. Namun, cara "variabel lingkungan" berfungsi dan mungkin juga menjadi alternatif yang baik untuk pendekatan Anda.sumber
Hanya pembaruan untuk pengguna .NET core 2.0, Anda dapat menentukan konfigurasi aplikasi setelah panggilan ke
CreateDefaultBuilder
:public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration(ConfigConfiguration) .UseStartup<Startup>() .Build(); static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config) { config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("config.json", optional: false, reloadOnChange: true) .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); } }
sumber
ASPNETCORE_ENVIRONMENT
. Nilainya adalah apa yang akan digantictx.HostingEnvironment.EnvironmentName}
. Jadi jika Anda menetapkan nilai itu di properti ke 'Produksi', proyek akan mencariconfig.Production.json
file di folder root. Untuk info lebih lanjut, silakan lihat tautanError CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
di WebHost.CreateDefaultBuiler (...Buat banyak file seperti:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Buat acara pra-bangun di proyek yang menyalin file terkait ke
appSettings.json
:Gunakan hanya
appSettings.json
di Config Builder Anda:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
sumber
Anda dapat menambahkan nama konfigurasi seperti
ASPNETCORE_ENVIRONMENT
dilaunchSettings.json
bawah ini"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
sumber
Ini adalah versi yang berfungsi untuk saya saat menggunakan aplikasi konsol tanpa halaman web:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true); IConfigurationRoot configuration = builder.Build(); AppSettings appSettings = new AppSettings(); configuration.GetSection("AppSettings").Bind(appSettings);
sumber
File .vscode / launch.json hanya digunakan oleh Visual Studio serta file /Properties/launchSettings.json. Jangan gunakan file ini dalam produksi.
File launchSettings.json:
berisi pengaturan profil.
Untuk menggunakan file 'appSettings.QA.json' misalnya. Anda dapat menggunakan 'ASPNETCORE_ENVIRONMENT'. Ikuti langkah-langkah di bawah ini.
sumber