Secara otomatis mengatur appsettings.json untuk lingkungan dev dan rilis di inti asp.net?

98

Saya telah menetapkan beberapa nilai dalam saya appsettings.jsonuntuk 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.jsonfile (seperti appsettings.live.json, dll, dll) dan membuat aplikasi asp.net hanya 'tahu' mana yang akan digunakan berdasarkan konfigurasi build yang dijalankannya?

tweetypi
sumber

Jawaban:

32

Anda dapat menggunakan kompilasi bersyarat:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
    .AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
    .AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}
Dmitry
sumber
26
Anda harus menetapkan variabel lingkungan Anda di MSBuild / TFS build. Kompilasi bersyarat menyebabkan kesalahan untuk sesuatu yang mudah ditangani dalam build CI. Yaitu, .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", opsional: true)
Nick Turner
1
Lihat jawaban saya ( stackoverflow.com/a/50331886/1319086 ) untuk variabel Lingkungan
Jonatan Dragon
9
Pendekatan semacam ini memaksa kode untuk dikompilasi ulang secara khusus untuk setiap lingkungan, sehingga tidak mungkin untuk didistribusikan / dipasang di tempat lain.
tvdias
1
Pertanyaannya adalah tentang "mengetahui tentang konfigurasi build"
Dmitry
4
Ini tidak boleh ditandai sebagai jawaban yang diterima - meskipun ini adalah solusi, itu bukan praktik terbaik.
Charleh
96

Saya telah menambahkan tangkapan layar dari lingkungan kerja, karena saya menghabiskan beberapa jam untuk R&D.

  1. Pertama, tambahkan kunci ke launch.jsonfile Anda .

    Lihat tangkapan layar di bawah ini, saya telah menambahkan Developmentsebagai lingkungan saya.

    Deklarasi variabel lingkungan di launch.json

  2. Kemudian, dalam proyek Anda, buat appsettings.{environment}.jsonfile baru yang menyertakan nama lingkungan.

    Di tangkapan layar berikut, cari dua file berbeda dengan nama:

    • appsettings.Development.Json
    • appSetting.json


    Tampilan proyek file JSON setelan aplikasi

  3. Dan terakhir, konfigurasikan ke StartUpkelas 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();
    }
    
  4. Dan akhirnya, Anda dapat menjalankannya dari baris perintah seperti ini:

    dotnet run --environment "Development"
    

    dimana "Development"nama lingkungan saya.

Bharat
sumber
2
Sudah mencoba ini dan hasilnya bagus. VS2017 bahkan menampilkan versi yang berbeda seperti di bawah file dasar. memilih.
Roberto
1
bagaimana Anda melakukannya di inti 2.2 karena ihostingenvironment telah dilanggar
djack109
2
@ djack109 Anda harus menggunakan IWebHostEnvironmentsebagai gantinya.
alessandrocb
54

Pembaruan untuk .NET Core 3.0+

  1. Anda dapat menggunakan CreateDefaultBuilderyang secara otomatis akan membangun dan meneruskan objek konfigurasi ke kelas startup Anda:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilderotomatis menyertakan file yang sesuai, jadi tambahkan file setelan aplikasi terpisah untuk setiap lingkungan:appsettings.Environment.json

    appsettings.env.json

  3. Kemudian atur ASPNETCORE_ENVIRONMENT variabel lingkungan saat menjalankan / debugging

Cara 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:

    Visual Studio - Variabel Lingkungan

  • Untuk kode Visual Studio , edit .vscode/launch.json> env:

    Kode Visual Studio> Luncurkan Lingkungan

  • Menggunakan Pengaturan Peluncuran , edit Properties/launchSettings.json> environmentVariables:

    Luncurkan Pengaturan

    Yang juga dapat dipilih dari Toolbar di Visual Studio

    Luncurkan Pengaturan Dropdown

  • Menggunakan dotnet CLI , gunakan sintaks yang sesuai untuk mengatur variabel lingkungan per OS Anda

    Catatan : Saat aplikasi diluncurkan dengan dotnet run , launchSettings.jsondibaca jika tersedia, dan environmentVariablessetelan di launchSettings.json menggantikan variabel lingkungan.

Bagaimana cara Host.CreateDefaultBuilderkerjanya?

.NET Core 3.0 ditambahkan di Host.CreateDefaultBuilderbawah ekstensi platform yang akan memberikan inisialisasi default IConfigurationyang menyediakan konfigurasi default untuk aplikasi dalam urutan berikut:

  1. appsettings.jsonmenggunakan penyedia konfigurasi JSON .
  2. appsettings.Environment.jsonmenggunakan penyedia konfigurasi JSON . Sebagai contoh:
    • appsettings.Production.json atau
    • appsettings.Development.json
  3. Rahasia aplikasi saat aplikasi berjalan di lingkungan Pengembangan.
  4. Variabel lingkungan menggunakan penyedia konfigurasi Variabel Lingkungan .
  5. Argumen baris perintah yang menggunakan penyedia konfigurasi baris perintah .

Bacaan Lebih Lanjut - MS Docs

KyleMit
sumber
Terima kasih, itu bagus tapi Bagaimana melakukannya dengan proses konsol (atau template / perancah proses pekerja)?
hB0
44

Di ASP.NET Core, Anda sebaiknya menggunakan Variabel Lingkungan daripada membangun konfigurasi untuk appsettings.json yang tepat

  1. Klik kanan pada proyek Anda> Properti> Debug> Variabel Lingkungan

    variabel lingkungan

  2. ASP.NET Core akan menggunakan file appsettings.json yang sesuai:

    contoh file pengaturan aplikasi di penjelajah solusi

  3. 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();
    }
    

Catatan : Jika Anda menggunakan jawaban @ Dmitry , Anda dapat mengalami masalah misalnya. saat mengganti nilai appsettings.json di Azure.

Jonatan Dragon
sumber
35

Anda dapat menggunakan variabel lingkungan dan ConfigurationBuilderkelas dalam Startupkonstruktor 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.jsonfile untuk setiap lingkungan yang Anda butuhkan, dengan "xxx" sebagai nama lingkungan. Perhatikan bahwa Anda dapat memasukkan semua nilai konfigurasi global dalam appsettings.jsonfile "normal" Anda dan hanya memasukkan hal-hal khusus lingkungan ke dalam file baru ini.

Sekarang Anda hanya membutuhkan variabel lingkungan yang dipanggil ASPNETCORE_ENVIRONMENTdengan 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.jsonberdasarkan 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.

Onkel Toob
sumber
Saya melihat menggunakan variabel lingkungan, di properti proyek-> bagian debug, namun tidak ada cara yang jelas bagaimana ini akan berubah berdasarkan pengaturan proyek. Apakah itu file lain yang dapat saya tambahkan ke proyek saya untuk menanganinya?
tweetypi
Mengatur variabel dalam properti proyek hanya akan berfungsi untuk menggunakannya di lingkungan pengembangan Anda (mungkin Visual Studio). Anda perlu mengaturnya di tempat lain untuk aplikasi yang Anda gunakan tergantung pada lingkungan tertentu (IIS, Azure). Saya tidak akan merekomendasikan untuk mengatur variabel dalam beberapa file konfigurasi karena file ini mungkin akan diterapkan juga, dan kemudian menimpa nilai server.
Onkel Toob
Anda menyiapkannya dalam konfigurasi build. Jika tidak ada file konfigurasi build, maka mereka melakukannya secara manual, jadi mereka perlu menyiapkannya di profil penerapan (kuno)
Nick Turner
Saya memiliki banyak lingkungan seperti pengujian, pementasan, dan produksi di Azure. Di mana saya mengubah variabel ASPNETCORE_ENVIRONMENT jika saya ingin menerbitkan versi rilis aplikasi web dari VS ke Azure?
sangat dingin
Kami tidak mengubah variabel selama penerapan, sebagai gantinya, variabel dibuat di lingkungan tertentu. Di Azure, Anda dapat menyetel nilai-nilai ini langsung dalam konfigurasi layanan aplikasi Anda di "Pengaturan aplikasi". Jangan lupa untuk menandainya sebagai "Pengaturan slot penyebaran" jika Anda bekerja dengan banyak slot.
Onkel Toob
29

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);

   }
 }
umutesen
sumber
1
Bagaimana Anda beralih di antara lingkungan yang digunakan? Apakah ada perubahan yang seharusnya dilakukan di file konfigurasi mana pun? Saya mengerti bahwa saya perlu menambahkan URL yang ingin saya gunakan saat proyek berjalan di Azure ke appsettings.json dan URL yang ingin saya jalankan saat dijalankan secara lokal (oleh F5) ke appsettings.Development.json . Apakah itu benar? String saya yang ingin saya gunakan ada di file launchSettings.json dan saya agak tidak jelas tentang cara mengubahnya berdasarkan di mana aplikasi dijalankan (atau jika seharusnya diubah sama sekali).
DonkeyBanana
3
@DonkeyBanana Lingkungan tidak lebih dari pengaturan yang ditentukan dalam properti proyek. Di VS 2017, klik kanan pada proyek> properti. Di bawah debug, Anda akan melihat lingkungan saat ini untuk kunci ASPNETCORE_ENVIRONMENT. Nilainya adalah apa yang akan diganti ctx.HostingEnvironment.EnvironmentName}. Jadi jika Anda menetapkan nilai itu di properti ke 'Produksi', proyek akan mencari config.Production.jsonfile di folder root. Untuk info lebih lanjut, silakan lihat tautan
umutesen
Membuat Error 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 (...
Hecatonchires
Perlu dicatat bahwa di sini menyatakan "AddJsonFile secara otomatis dipanggil dua kali saat Anda menginisialisasi pembuat host baru dengan CreateDefaultBuilder". Dengan kata lain, itu sudah memuat appSettings.json dan kemudian berdasarkan konfigurasi lingkungan Anda, itu memuat setelan aplikasi. {Lingkungan} .json
David Yates
13
  1. Buat banyak file seperti:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. Buat acara pra-bangun di proyek yang menyalin file terkait ke appSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. Gunakan hanya appSettings.jsondi Config Builder Anda:

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    
pengguna3924036
sumber
Ini harus menjadi jawaban yang diterima. Untuk kasus yang rumit, SlowCheetah dapat digunakan.
Anton Krouglov
8

Anda dapat menambahkan nama konfigurasi seperti ASPNETCORE_ENVIRONMENTdi launchSettings.jsonbawah ini

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }
Fleaca Dan
sumber
2

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);
Nick Cordova
sumber
0

File .vscode / launch.json hanya digunakan oleh Visual Studio serta file /Properties/launchSettings.json. Jangan gunakan file ini dalam produksi.

File launchSettings.json:

  1. Hanya digunakan di mesin pengembangan lokal.
  2. Tidak diterapkan.
  3. berisi pengaturan profil.

    • Nilai lingkungan yang disetel di launchSettings.json mengganti nilai yang disetel di lingkungan sistem

Untuk menggunakan file 'appSettings.QA.json' misalnya. Anda dapat menggunakan 'ASPNETCORE_ENVIRONMENT'. Ikuti langkah-langkah di bawah ini.

  1. Tambahkan Variabel Lingkungan baru pada mesin host dan beri nama 'ASPNETCORE_ENVIRONMENT'. Setel nilainya menjadi 'QA'.
  2. Buat file 'appSettings.QA.json' di proyek Anda. Tambahkan konfigurasi Anda di sini.
  3. Terapkan ke mesin pada langkah 1. Konfirmasi 'appSettings.QA.json' diterapkan.
  4. Muat situs web Anda. Harapkan appSettings.QA.json untuk digunakan di sini.
Oks Xen
sumber