ตั้งค่า appsettings.json โดยอัตโนมัติสำหรับสภาพแวดล้อมการพัฒนาและรีลีสในแกน asp.net หรือไม่


98

ฉันได้กำหนดค่าบางอย่างใน my appsettings.jsonสำหรับสิ่งต่างๆเช่นสตริงการเชื่อมต่อฐานข้อมูลตำแหน่ง webapi และสิ่งที่คล้ายกันซึ่งแตกต่างกันสำหรับการพัฒนาการจัดเตรียมและสภาพแวดล้อมแบบสด

มีวิธีการมีหลายappsettings.jsonไฟล์ (เช่นappsettings.live.jsonฯลฯ ฯลฯ ) และมีแอป asp.net เพียงแค่ 'รู้' ว่าจะใช้ไฟล์ใดตามการกำหนดค่าบิลด์ที่กำลังทำงานอยู่

คำตอบ:


32

คุณสามารถใช้การรวบรวมตามเงื่อนไข:

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
คุณควรตั้งค่าตัวแปรสภาพแวดล้อมของคุณในการสร้าง MSBuild / TFS การคอมไพล์ตามเงื่อนไขนำไปสู่ความผิดพลาดสำหรับบางสิ่งที่จัดการได้อย่างง่ายดายในโครงสร้าง CI คือ .AddJsonFile ($ "appsettings. {env.EnvironmentName} .json", optional: true)
Nick Turner

1
ดูคำตอบของฉัน ( stackoverflow.com/a/50331886/1319086 ) สำหรับตัวแปรสภาพแวดล้อม
Jonatan Dragon

9
วิธีการแบบนี้บังคับให้คอมไพล์โค้ดใหม่โดยเฉพาะสำหรับแต่ละสภาพแวดล้อมทำให้ไม่สามารถแจกจ่าย / ติดตั้งที่อื่นได้
tvdias

1
คำถามเกี่ยวกับ“ ความรู้เกี่ยวกับโครงสร้างการสร้าง”
Dmitry

4
ไม่ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับ - แม้ว่าจะเป็นวิธีแก้ปัญหา แต่ก็ไม่ใช่แนวทางปฏิบัติที่ดีที่สุด
Charleh

96

ฉันได้เพิ่มภาพหน้าจอของสภาพแวดล้อมการทำงานเนื่องจากต้องใช้เวลาหลายชั่วโมงในการวิจัยและพัฒนา

  1. ขั้นแรกให้เพิ่มคีย์ลงในlaunch.jsonไฟล์ของคุณ

    ดูภาพหน้าจอด้านล่างฉันได้เพิ่มDevelopmentเป็นสภาพแวดล้อมของฉัน

    การประกาศตัวแปรสภาพแวดล้อมใน launch.json

  2. จากนั้นในโครงการของคุณให้สร้างappsettings.{environment}.jsonไฟล์ใหม่ที่มีชื่อของสภาพแวดล้อม

    ในภาพหน้าจอต่อไปนี้ให้มองหาไฟล์สองไฟล์ที่มีชื่อ:

    • appsettings.Development.Json
    • appSetting.json


    มุมมองโครงการของไฟล์ JSON ของ appsettings

  3. และสุดท้ายกำหนดค่าให้กับ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)
            .AddEnvironmentVariables();
    
        Configuration = builder.Build();
    }
    
  4. และในที่สุดคุณสามารถเรียกใช้จากบรรทัดคำสั่งเช่นนี้:

    dotnet run --environment "Development"
    

    ที่"Development"เป็นชื่อของสภาพแวดล้อมของฉัน


2
ลองใช้แล้วได้ผลดี VS2017 ยังแสดงเวอร์ชันที่แตกต่างกันภายใต้ไฟล์ฐาน ขึ้นโหวต.
Roberto

1
คุณทำได้อย่างไรใน core 2.2 เนื่องจาก ihostingenvironment ถูกยกเลิก
djack109

2
@ djack109 คุณควรใช้IWebHostEnvironmentแทน
alessandrocb

53

อัปเดตสำหรับ. NET Core 3.0+

  1. คุณสามารถใช้CreateDefaultBuilderซึ่งจะสร้างและส่งผ่านวัตถุการกำหนดค่าไปยังคลาสเริ่มต้นของคุณโดยอัตโนมัติ:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilderรวมไฟล์ที่เหมาะสมโดยอัตโนมัติดังนั้นให้เพิ่มไฟล์ appsettings แยกต่างหากสำหรับแต่ละสภาพแวดล้อม:appsettings.Environment.json

    appsettings.env.json

  3. จากนั้นตั้งค่าASPNETCORE_ENVIRONMENT ตัวแปรสภาพแวดล้อมเมื่อรัน / ดีบัก

วิธีตั้งค่าตัวแปรสภาพแวดล้อม

ขึ้นอยู่กับ IDE ของคุณมีสองสถานที่ที่โครงการดอทเน็ตมักมองหาตัวแปรสภาพแวดล้อม:

  • สำหรับVisual Studioไปที่ Project> Properties> Debug> Environment Variables:

    Visual Studio - ตัวแปรสภาพแวดล้อม

  • สำหรับVisual Studio Codeแก้ไข.vscode/launch.json> env:

    Visual Studio Code> สภาพแวดล้อมการเปิดตัว

  • ใช้Launch Settingsแก้ไขProperties/launchSettings.json> environmentVariables:

    เปิดการตั้งค่า

    ซึ่งสามารถเลือกได้จาก Toolbar ใน Visual Studio

    เปิดการตั้งค่าดรอปดาวน์

  • การใช้dotnet CLIใช้ไวยากรณ์ที่เหมาะสมสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมตามระบบปฏิบัติการของคุณ

    หมายเหตุ : เมื่อแอปเปิดตัวด้วยระยะ dotnet , launchSettings.jsonถูกอ่านถ้าพร้อมใช้งานและenvironmentVariablesการตั้งค่าใน launchSettings.json ตัวแปรสภาพแวดล้อมแทนที่

วิธีการHost.CreateDefaultBuilderทำงานหรือไม่

.NET Core 3.0 เพิ่มHost.CreateDefaultBuilderภายใต้ส่วนขยายแพลตฟอร์มซึ่งจะให้การเริ่มต้นเริ่มต้นIConfigurationซึ่งจะให้การกำหนดค่าเริ่มต้นสำหรับแอปตามลำดับต่อไปนี้

  1. appsettings.jsonโดยใช้ผู้ให้บริการกำหนดค่า JSON
  2. appsettings.Environment.jsonโดยใช้ผู้ให้บริการกำหนดค่า JSON ตัวอย่างเช่น:
    • appsettings.Production.json หรือ
    • appsettings.Development.json
  3. ความลับของแอปเมื่อแอปทำงานในสภาพแวดล้อมการพัฒนา
  4. ตัวแปรสภาพแวดล้อมโดยใช้ผู้ให้บริการกำหนดค่าตัวแปรของสภาพแวดล้อม
  5. อาร์กิวเมนต์บรรทัดคำสั่งโดยใช้ผู้ให้บริการกำหนดค่าบรรทัดคำสั่ง

การอ่านเพิ่มเติม - MS Docs


ขอบคุณเป็นเรื่องดี แต่จะทำอย่างไรกับกระบวนการคอนโซล (หรือเทมเพลตกระบวนการของผู้ปฏิบัติงาน / นั่งร้าน)
hB0

44

ใน ASP.NET Core คุณควรใช้ Environment Variables แทนการสร้างคอนฟิกูเรชันสำหรับ appsettings.json ที่เหมาะสม

  1. คลิกขวาที่โปรเจ็กต์ของคุณ> คุณสมบัติ> ดีบัก> ตัวแปรสภาพแวดล้อม

    ตัวแปรสภาพแวดล้อม

  2. ASP.NET Core จะใช้ไฟล์ appsettings.json ที่เหมาะสม:

    ตัวอย่างของไฟล์ appsettings ใน solution explorer

  3. ตอนนี้คุณสามารถใช้ Environment Variable ได้ดังนี้:

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

หมายเหตุ : หากคุณใช้คำตอบของ @ Dmitryคุณอาจพบปัญหาเช่น เมื่อแทนที่ค่า appsettings.json บน Azure


35

คุณสามารถใช้ตัวแปรสภาพแวดล้อมและConfigurationBuilderคลาสในตัว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();
}

จากนั้นคุณจะสร้างappsettings.xxx.jsonไฟล์สำหรับทุกสภาพแวดล้อมที่คุณต้องการโดยมี "xxx" เป็นชื่อสภาพแวดล้อม โปรดทราบว่าคุณสามารถใส่ค่าการกำหนดค่าส่วนกลางทั้งหมดในappsettings.jsonไฟล์"ปกติ" ของคุณและใส่เฉพาะสภาพแวดล้อมลงในไฟล์ใหม่เหล่านี้

ตอนนี้คุณต้องการเพียงตัวแปรสภาพแวดล้อมที่เรียกASPNETCORE_ENVIRONMENTด้วยค่าสภาพแวดล้อมที่เฉพาะเจาะจง ("live", "staging", "production" อะไรก็ได้) คุณสามารถระบุตัวแปรนี้ในการตั้งค่าโปรเจ็กต์สำหรับสภาพแวดล้อมการพัฒนาของคุณและแน่นอนว่าคุณต้องตั้งค่าในสภาพแวดล้อมการจัดเตรียมและการใช้งานจริงด้วย วิธีที่คุณทำขึ้นอยู่กับสภาพแวดล้อมแบบนี้

UPDATE:ฉันเพิ่งตระหนักคุณต้องการที่จะเลือกappsettings.xxx.jsonขึ้นอยู่กับปัจจุบันของคุณสร้างการกำหนดค่า สิ่งนี้ไม่สามารถทำได้ด้วยวิธีแก้ปัญหาที่ฉันเสนอและฉันไม่รู้ว่ามีวิธีทำหรือไม่ อย่างไรก็ตามวิธี "ตัวแปรสภาพแวดล้อม" ได้ผลและอาจเป็นทางเลือกที่ดีสำหรับแนวทางของคุณด้วย


ฉันดูการใช้ตัวแปรสภาพแวดล้อมในส่วนคุณสมบัติของโครงการ -> อย่างไรก็ตามไม่มีวิธีที่ชัดเจนว่าสิ่งนี้จะเปลี่ยนแปลงไปตามการตั้งค่าโครงการอย่างไร ฉันสามารถเพิ่มไฟล์อื่นในโปรเจ็กต์เพื่อจัดการไฟล์ได้หรือไม่
Tweetypi

การตั้งค่าตัวแปรภายในคุณสมบัติโปรเจ็กต์จะใช้ได้เฉพาะในสภาพแวดล้อมการพัฒนาของคุณเท่านั้น (อาจเป็น Visual Studio) คุณจะต้องตั้งค่าไว้ที่อื่นสำหรับแอปที่ปรับใช้ของคุณขึ้นอยู่กับสภาพแวดล้อมเฉพาะ (IIS, Azure) ฉันไม่แนะนำให้ตั้งค่าตัวแปรในไฟล์คอนฟิกูเรชันบางไฟล์เนื่องจากไฟล์นี้อาจถูกปรับใช้ด้วยจากนั้นจึงแทนที่ค่าเซิร์ฟเวอร์
Onkel Toob

คุณตั้งค่าในการกำหนดค่าการสร้าง หากไม่มีไฟล์คอนฟิกูเรชันบิลด์แสดงว่าพวกเขากำลังดำเนินการด้วยตนเองดังนั้นพวกเขาจะต้องตั้งค่าในโปรไฟล์การปรับใช้ (โบราณ)
Nick Turner

ฉันมีสภาพแวดล้อมหลายอย่างเช่นการทดสอบการจัดเตรียมและการผลิตใน Azure ฉันจะเปลี่ยนตัวแปร ASPNETCORE_ENVIRONMENT ได้ที่ไหนถ้าฉันต้องการเผยแพร่เวอร์ชันสร้างของเว็บแอปจาก VS เป็น Azure
หนาวจัด

เราไม่เปลี่ยนตัวแปรระหว่างการปรับใช้ แต่จะถูกสร้างขึ้นในสภาพแวดล้อมเฉพาะ ใน Azure คุณสามารถตั้งค่าเหล่านี้ได้โดยตรงภายในการกำหนดค่าบริการแอปของคุณกับ "การตั้งค่าแอปพลิเคชัน" อย่าลืมทำเครื่องหมายเป็น "การตั้งค่าสล็อตการปรับใช้" ในกรณีที่คุณกำลังทำงานกับสล็อตหลายช่อง
Onkel Toob

29

เพียงแค่อัปเดตสำหรับผู้ใช้. NET core 2.0 คุณสามารถระบุการกำหนดค่าแอปพลิเคชันหลังจากโทรไปที่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
คุณสลับไปมาระหว่างสภาพแวดล้อมที่ใช้งานได้อย่างไร? มีการเปลี่ยนแปลงที่ควรทำในไฟล์กำหนดค่าหรือไม่? ฉันเข้าใจว่าฉันจะต้องเพิ่ม URL ที่ฉันต้องการที่จะใช้เมื่อโครงการวิ่งบน Azure เพื่อappsettings.jsonและ URL ที่ฉันต้องการที่จะดำเนินการเมื่อทำงานในท้องถิ่น (โดย F5) เพื่อappsettings.Development.json ถูกต้องหรือไม่ สตริงของฉันที่ฉันต้องการใช้อยู่ในไฟล์launchSettings.jsonและฉันไม่ชัดเจนเล็กน้อยเกี่ยวกับวิธีแก้ไขตามตำแหน่งที่แอปพลิเคชันเรียกใช้งาน (หรือว่าควรจะเปลี่ยนแปลงเลย)
DonkeyBanana

3
@DonkeyBanana สภาพแวดล้อมไม่มีอะไรมากไปกว่าการตั้งค่าที่ระบุในคุณสมบัติโครงการ ใน VS 2017 คลิกขวาที่โครงการ> คุณสมบัติ ASPNETCORE_ENVIRONMENTภายใต้การแก้ปัญหาคุณจะเห็นสภาพแวดล้อมในปัจจุบันสำหรับคีย์ ctx.HostingEnvironment.EnvironmentName}ค่าเป็นสิ่งที่จะถูกแทนที่สำหรับ ดังนั้นหากคุณตั้งค่านั้นในคุณสมบัติเป็น 'การผลิต' โปรเจ็กต์จะค้นหาconfig.Production.jsonไฟล์ในโฟลเดอร์รูท สำหรับข้อมูลเพิ่มเติมโปรดดูลิงค์
umutesen

สร้าง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 (...
Hecatonchires

เป็นที่น่าสังเกตว่าที่นี่ระบุว่า "AddJsonFile ถูกเรียกโดยอัตโนมัติสองครั้งเมื่อคุณเริ่มต้นตัวสร้างโฮสต์ใหม่ด้วย CreateDefaultBuilder" กล่าวอีกนัยหนึ่งก็คือมันกำลังโหลด appSettings.json แล้วจากนั้นตามการกำหนดค่าสภาพแวดล้อมของคุณมันกำลังโหลด appsettings {Environment} .json
David Yates

13
  1. สร้างไฟล์หลายไฟล์เช่น:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. สร้างเหตุการณ์ก่อนสร้างในโปรเจ็กต์ซึ่งคัดลอกไฟล์ตามลำดับไปยังappSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. ใช้เฉพาะappSettings.jsonใน Config Builder ของคุณ:

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

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ สำหรับกรณีที่ซับซ้อนอาจใช้SlowCheetah
Anton Krouglov

8

คุณสามารถเพิ่มชื่อการกำหนดค่าเป็นASPNETCORE_ENVIRONMENTในlaunchSettings.jsonดังต่อไปนี้

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

2

นี่เป็นเวอร์ชันที่เหมาะกับฉันเมื่อใช้แอปคอนโซลที่ไม่มีหน้าเว็บ:

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 ใช้เฉพาะโดย Visual Studio เช่นเดียวกับไฟล์ /Properties/launchSettings.json อย่าใช้ไฟล์เหล่านี้ในการผลิต

ไฟล์ launchSettings.json:

  1. ใช้กับเครื่องพัฒนาท้องถิ่นเท่านั้น
  2. ไม่มีการปรับใช้
  3. มีการตั้งค่าโปรไฟล์

    • ค่าสภาพแวดล้อมที่ตั้งค่าใน launchSettings.json ค่าแทนที่ที่ตั้งไว้ในสภาพแวดล้อมระบบ

ในการใช้ไฟล์ 'appSettings.QA.json' เช่น คุณสามารถใช้ "ASPNETCORE_ENVIRONMENT" ทำตามขั้นตอนด้านล่าง

  1. เพิ่มตัวแปรสภาพแวดล้อมใหม่บนเครื่องโฮสต์และเรียกมันว่า 'ASPNETCORE_ENVIRONMENT' ตั้งค่าเป็น 'QA'
  2. สร้างไฟล์ 'appSettings.QA.json' ในโปรเจ็กต์ของคุณ เพิ่มการกำหนดค่าของคุณที่นี่
  3. ปรับใช้กับเครื่องในขั้นตอนที่ 1 ยืนยันว่ามีการปรับใช้ 'appSettings.QA.json'
  4. โหลดเว็บไซต์ของคุณ คาดว่า appSettings.QA.json จะถูกใช้ที่นี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.