Asp.net çekirdeğindeki geliştirme ve yayın ortamları için appsettings.json otomatik olarak ayarlansın mı?


98

appsettings.jsonGeliştirme, hazırlık ve canlı ortamlar için farklı olan veritabanı bağlantı dizeleri, webapi konumları ve benzeri şeyler için bazı değerler tanımladım .

Birden fazla appsettings.jsondosyaya ( appsettings.live.jsonvb.) Sahip olmanın ve asp.net uygulamasının çalıştırdığı yapı yapılandırmasına bağlı olarak hangisinin kullanılacağını bilmesinin bir yolu var mı?

Yanıtlar:


31

Koşullu derlemeyi kullanabilirsiniz:

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

26
Ortam değişkeninizi MSBuild / TFS yapınızda ayarlamalısınız. Koşullu derleme, CI yapılarında kolayca ele alınan bir şey için hatalara yol açar. Yani, .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", isteğe bağlı: true)
Nick Turner

1
Çevre değişkeni için cevabımı görün ( stackoverflow.com/a/50331886/1319086 )
Jonatan Dragon

9
Bu tür bir yaklaşım, kodu her ortam için özel olarak yeniden derlenmeye zorlayarak başka bir yere yeniden dağıtılmasını / kurulmasını imkansız hale getirir.
tvdias

1
Soru, "derleme yapılandırmasını bilmek" hakkındaydı
Dmitry

4
Bu, kabul edilen cevap olarak işaretlenmemelidir - bu bir çözüm olsa da en iyi uygulama değildir.
Charleh

96

Bir çalışma ortamının ekran görüntülerini ekledim, çünkü bana birkaç saatlik Ar-Ge'ye mal oldu.

  1. İlk önce launch.jsondosyanıza bir anahtar ekleyin .

    Aşağıdaki ekran görüntüsüne bakın, ortamım Developmentolarak ekledim .

    Launch.json'daki ortam değişkeninin bildirimi

  2. Ardından, projenizde appsettings.{environment}.jsonortamın adını içeren yeni bir dosya oluşturun .

    Aşağıdaki ekran görüntüsünde, adlara sahip iki farklı dosya arayın:

    • appsettings.Development.Json
    • appSetting.json


    Appsettings JSON dosyalarının proje görünümü

  3. Ve son olarak, bunu StartUpsınıfınıza göre şu şekilde yapılandırın :

    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. Ve sonunda komut satırından şu şekilde çalıştırabilirsiniz:

    dotnet run --environment "Development"
    

    "Development"ortamımın adı nerede .


2
Bunu denedim ve harika çalışıyor. VS2017, temel dosyanın altındaki farklı sürümleri bile görüntüler. yukarı oy.
Roberto

1
çevremiz kullanımdan kaldırıldığı için çekirdek 2.2'de bunu nasıl yaparsınız
djack109

2
@ djack109 IWebHostEnvironmentbunun yerine kullanmalısınız .
alessandrocb

54

.NET Core 3.0+ için güncelleme

  1. CreateDefaultBuilderBaşlangıç ​​sınıfınıza otomatik olarak bir yapılandırma nesnesi oluşturacak ve iletecek olanı kullanabilirsiniz :

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilderotomatik olarak uygun dosyayı içerir, bu nedenle her ortam için ayrı bir appsettings dosyası ekleyin:appsettings.Environment.json

    appsettings.env.json

  3. Ardından çalıştırırken / hata ayıklarken ASPNETCORE_ENVIRONMENT ortam değişkenini ayarlayın

Ortam Değişkenleri nasıl ayarlanır

IDE'nize bağlı olarak, dotnet projelerinin geleneksel olarak ortam değişkenlerini aradığı birkaç yer vardır:

  • İçin Visual Studio Project> Özellikleri> Debug> Ortam Değişkenleri gidin:

    Visual Studio - Ortam Değişkenleri

  • İçin Visual Studio Kanunu , düzenleme .vscode/launch.json> env:

    Visual Studio Code> Başlatma Ortamı

  • Başlatma Ayarlarını kullanarak düzenle Properties/launchSettings.json> environmentVariables:

    Ayarları Başlat

    Visual Studio'daki Araç Çubuğundan da seçilebilir

    Ayarlar Açılır Menüsünü Başlat

  • Dotnet CLI kullanarak , işletim sisteminize göre ortam değişkenlerini ayarlamak için uygun sözdizimini kullanın

    Not : Bir uygulama dotnet run ile başlatıldığında , launchSettings.jsonvarsa okunur ve environmentVariableslaunchSettings.json'daki ayarlar ortam değişkenlerini geçersiz kılar.

Nasıl Host.CreateDefaultBuilderçalışır?

.NET Core 3.0 Host.CreateDefaultBuilder, varsayılan bir başlatma IConfigurationsağlayan ve uygulama için aşağıdaki sırayla varsayılan yapılandırma sağlayan platform uzantılarının altına eklendi :

  1. appsettings.jsonJSON yapılandırma sağlayıcısını kullanarak .
  2. appsettings.Environment.jsonJSON yapılandırma sağlayıcısını kullanarak . Örneğin:
    • appsettings.Production.json veya
    • appsettings.Development.json
  3. Uygulama Geliştirme ortamında çalıştığında uygulama sırları .
  4. Ortam Değişkenleri yapılandırma sağlayıcısını kullanan ortam değişkenleri .
  5. Komut satırı yapılandırma sağlayıcısını kullanan komut satırı bağımsız değişkenleri .

Daha Fazla Okuma - MS Docs


Teşekkürler, iyi ama bunu konsol işlemiyle (veya çalışan işlem şablonu / iskele) nasıl yapabilirim?
hB0

44

ASP.NET Core'da düzgün appsettings.json için yapılandırma yapılandırması yerine Ortam Değişkenlerini kullanmanız gerekir

  1. Projenize sağ tıklayın> Özellikler> Hata Ayıklama> Ortam Değişkenleri

    Ortam Değişkenleri

  2. ASP.NET Core, uygun appsettings.json dosyasını kullanır:

    Çözüm gezgininde appsettings dosyalarına örnek

  3. Artık bu Ortam Değişkenini şu şekilde kullanabilirsiniz:

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

Not : @ Dmitry'nin cevabını kullanırsanız , sorunlarla karşılaşabilirsiniz, örn. ne zaman Azure üzerinde appsettings.json değeri geçersiz kılmak.


35

Oluşturucunuzdaki ortam değişkenlerini ve ConfigurationBuildersınıfı şu şekilde kullanabilirsiniz Startup:

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

Daha sonra appsettings.xxx.jsonihtiyacınız olan her ortam için ortam adı "xxx" olacak şekilde bir dosya oluşturursunuz . Tüm global konfigürasyon değerlerini "normal" appsettings.jsondosyanıza koyabileceğinizi ve sadece ortama özgü şeyleri bu yeni dosyalara koyabileceğinizi unutmayın.

Şimdi sadece ASPNETCORE_ENVIRONMENTbelirli bir ortam değeri ile adlandırılan bir ortam değişkenine ihtiyacınız var ("canlı", "aşamalandırma", "üretim", her neyse). Bu değişkeni geliştirme ortamınız için proje ayarlarınızda belirtebilirsiniz ve elbette onu hazırlık ve üretim ortamlarınızda da ayarlamanız gerekir. Orada nasıl yapacağınız, bunun ne tür bir ortam olduğuna bağlıdır.

GÜNCELLEME:appsettings.xxx.json Şu anki yapı yapılandırmanıza göre seçim yapmak istediğinizi fark ettim . Bu, önerdiğim çözümle başarılamaz ve bunu yapmanın bir yolu olup olmadığını bilmiyorum. Ancak "ortam değişkeni" yöntemi işe yarar ve yaklaşımınız için iyi bir alternatif olabilir.


Proje özellikleri-> hata ayıklama bölümünde ortam değişkenlerini kullanmaya baktım, ancak bunun proje ayarlarına göre nasıl değişeceğinin açık bir yolu yok. Bu, işlemek için projeme ekleyebileceğim başka bir dosya mı?
tweetypi

Değişkeni proje özelliklerinde ayarlamak yalnızca onu geliştirme ortamınızda (muhtemelen Visual Studio) kullanmak için işe yarar. Belirli ortama (IIS, Azure) bağlı olarak dağıtılan uygulamalarınız için başka bir yerde ayarlamanız gerekecektir. Değişkeni bazı yapılandırma dosyasında ayarlamanızı tavsiye etmem çünkü bu dosya da konuşlandırılabilir ve ardından sunucu değerlerini geçersiz kılabilir.
Onkel Toob

Bunu yapı yapılandırmalarında ayarlarsınız. Sonra bir yapı yapılandırma dosyası yoksa onlar (archaic) içinde kurmak dağıtım profili gerekir böylece elle bunu yapıyor
Nick Turner

Azure'da test, hazırlık ve üretim gibi birden çok ortamım var. Web uygulamasının yayın yapısını VS'den Azure'a yayımlamak istersem ASPNETCORE_ENVIRONMENT değişkenini nerede değiştirebilirim?
soğuk

Değişkenleri dağıtım sırasında değiştirmeyiz, bunun yerine belirli ortama yerleştirilirler. Azure'da, bu değerleri doğrudan uygulama hizmeti yapılandırmanızda "Uygulama ayarları" altında ayarlayabilirsiniz. Birden fazla yuvayla çalışmanız durumunda, bunları "Dağıtım yuvası ayarları" olarak işaretlemeyi unutmayın.
Onkel Toob

29

Yalnızca .NET çekirdek 2.0 kullanıcıları için bir güncelleme, şu çağrıdan sonra uygulama yapılandırmasını belirtebilirsiniz 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);

   }
 }

1
Kullanılan ortamlar arasında nasıl geçiş yaparsınız? Herhangi bir yapılandırma dosyasında yapılması gereken değişiklikler var mı? Proje Azure'da çalıştığında kullanmak istediğim URL'yi appsettings.json'a ve yerel olarak çalıştırdığımda yürütmek istediğim URL'yi (F5'e göre) appsettings.Development.json'a eklemem gerektiğini anlıyorum . Bu doğru mu? Kullanmak istediğim dizgim launchSettings.json dosyasında ve uygulamanın yürütüldüğü yere (veya değiştirilmesinin gerekip gerekmediğine) bağlı olarak onu nasıl değiştireceğim konusunda biraz kararsızım .
DonkeyBanana

3
@DonkeyBanana Ortam, proje özelliklerinde belirtilen bir ayardan başka bir şey değildir. VS 2017'de proje> özellikler üzerine sağ tıklayın. Hata ayıklama altında, anahtar için geçerli ortamı göreceksiniz ASPNETCORE_ENVIRONMENT. Değer, ne için değiştirileceğidir ctx.HostingEnvironment.EnvironmentName}. Dolayısıyla, özelliklerde bu değeri 'Üretim' olarak ayarlarsanız, proje config.Production.jsonkök klasörde dosya arayacaktır . Daha fazla bilgi için lütfen bu bağlantıyı
umutesen

Bir oluşturur Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) ... WebHost.CreateDefaultBuiler (içinde
Hecatonchires

Burada "CreateDefaultBuilder ile yeni bir ana bilgisayar oluşturucuyu başlattığınızda AddJsonFile otomatik olarak iki kez çağrılır" ifadesini belirtmek gerekir . Başka bir deyişle, zaten appSettings.json'u yüklüyor ve ardından ortam yapılandırmanıza bağlı olarak, appsettings yüklüyor. {Environment} .json
David Yates

13
  1. Aşağıdakiler gibi birden çok dosya oluşturun :appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. Proje üzerinde ilgili dosyayı kopyalayan bir ön derleme olayı oluşturun appSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. Yalnızca appSettings.jsonConfig Builder'ınızda kullanın :

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    

Bu kabul edilen bir cevap olmalıdır. Karmaşık durumlarda SlowCheetah kullanılabilir.
Anton Krouglov

8

Sen gibi yapılandırma adı ekleyebilir ASPNETCORE_ENVIRONMENTiçinde launchSettings.jsonaşağıda

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

2

Bu, web sayfası olmayan bir konsol uygulamasını kullanırken benim için çalışan sürümdür:

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

0

.vscode / launch.json dosyası yalnızca Visual Studio ve /Properties/launchSettings.json dosyası tarafından kullanılır. Bu dosyaları üretimde kullanmayın.

LaunchSettings.json dosyası:

  1. Yalnızca yerel geliştirme makinesinde kullanılır.
  2. Dağıtılmadı.
  3. profil ayarlarını içerir.

    • LaunchSettings.json'da ayarlanan ortam değerleri, sistem ortamında ayarlanan değerleri geçersiz kılar

Örneğin 'appSettings.QA.json' dosyasını kullanmak için. 'ASPNETCORE_ENVIRONMENT' kullanabilirsiniz. Aşağıdaki adımları takip et.

  1. Ana makineye yeni bir Ortam Değişkeni ekleyin ve buna "ASPNETCORE_ENVIRONMENT" adını verin. Değerini 'QA' olarak ayarlayın.
  2. Projenizde bir 'appSettings.QA.json' dosyası oluşturun. Yapılandırmanızı buraya ekleyin.
  3. 1. adımda makineye dağıtın. 'AppSettings.QA.json'un dağıtıldığını doğrulayın.
  4. Web sitenizi yükleyin. AppSettings.QA.json'un burada kullanılmasını bekleyin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.