Tự động đặt appsettings.json cho môi trường phát triển và nhà phát triển trong lõi asp.net?


98

Tôi đã xác định một số giá trị trong của mình appsettings.jsoncho những thứ như chuỗi kết nối cơ sở dữ liệu, vị trí webapi và những thứ tương tự khác cho môi trường phát triển, dàn dựng và trực tiếp.

Có cách nào để có nhiều appsettings.jsontệp (như appsettings.live.json, v.v., v.v.) và ứng dụng asp.net chỉ 'biết' cái nào để sử dụng dựa trên cấu hình bản dựng mà nó đang chạy không?

Câu trả lời:


31

Bạn có thể sử dụng biên dịch có điều kiện:

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
Bạn nên đặt biến môi trường của mình trong bản dựng MSBuild / TFS. Biên dịch có điều kiện dẫn đến những sai lầm đối với một số thứ dễ dàng xử lý trong các bản dựng CI. Tức là .AddJsonFile ($ "appsettings. {Env.EnosystemName} .json", tùy chọn: true)
Nick Turner

1
Xem câu trả lời của tôi ( stackoverflow.com/a/50331886/1319086 ) cho biến Môi trường
Jonatan Dragon

9
Cách tiếp cận này buộc mã phải được biên dịch lại cụ thể cho từng môi trường, khiến nó không thể được phân phối lại / cài đặt ở nơi khác.
tvdias

1
Câu hỏi về “biết về cấu hình bản dựng”
Dmitry,

4
Đây không nên được đánh dấu là câu trả lời được chấp nhận - mặc dù đây là một giải pháp nhưng nó không phải là phương pháp hay nhất.
Charleh

96

Tôi đã thêm ảnh chụp màn hình của môi trường làm việc, vì tôi đã tốn vài giờ R&D.

  1. Đầu tiên, thêm khóa vào launch.jsontệp của bạn .

    Xem ảnh chụp màn hình bên dưới, tôi đã thêm Developmentlàm môi trường của mình.

    Khai báo biến môi trường trong launcher.json

  2. Sau đó, trong dự án của bạn, hãy tạo một appsettings.{environment}.jsontệp mới bao gồm tên của môi trường.

    Trong ảnh chụp màn hình sau, hãy tìm hai tệp khác nhau có tên:

    • appsettings.Development.Json
    • appSetting.json


    Chế độ xem dự án của các tệp JSON cài đặt ứng dụng

  3. Và cuối cùng, cấu hình nó cho StartUplớp của bạn như thế này:

    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. Và cuối cùng, bạn có thể chạy nó từ dòng lệnh như sau:

    dotnet run --environment "Development"
    

    nơi "Development"là tên của môi trường của tôi.


2
Đã thử điều này và nó hoạt động tuyệt vời. VS2017 thậm chí còn hiển thị các phiên bản khác nhau dưới dạng tệp cơ sở. lên biểu quyết.
Roberto

1
làm thế nào để bạn làm điều đó trong lõi 2.2 như ihostingenvironment được deprected
djack109

2
@ djack109 bạn nên sử dụng IWebHostEnvironmentthay thế.
alessandrocb

54

Cập nhật cho .NET Core 3.0+

  1. Bạn có thể sử dụng CreateDefaultBuildernó sẽ tự động xây dựng và chuyển một đối tượng cấu hình cho lớp khởi động của bạn:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuildertự động bao gồm tệp thích hợp để thêm tệp cài đặt ứng dụng riêng cho từng môi trường:appsettings.Environment.json

    appsettings.env.json

  3. Sau đó, đặt ASPNETCORE_ENVIRONMENT biến môi trường khi chạy / gỡ lỗi

Cách đặt Biến môi trường

Tùy thuộc vào IDE của bạn, có một số nơi các dự án dotnet truyền thống tìm kiếm các biến môi trường:

  • Đối với Visual Studio, đi tới Dự án> Thuộc tính> Gỡ lỗi> Biến môi trường:

    Visual Studio - Biến môi trường

  • Đối với Mã Visual Studio , hãy chỉnh sửa .vscode/launch.json> env:

    Mã Visual Studio> Môi trường khởi chạy

  • Sử dụng Cài đặt Khởi chạy , chỉnh sửa Properties/launchSettings.json> environmentVariables:

    Khởi chạy cài đặt

    Cũng có thể được chọn từ Thanh công cụ trong Visual Studio

    Khởi chạy Cài đặt thả xuống

  • Sử dụng dotnet CLI , sử dụng cú pháp thích hợp để đặt các biến môi trường cho mỗi hệ điều hành của bạn

    Lưu ý : Khi một ứng dụng được khởi chạy với dotnet run , launchSettings.jsonsẽ được đọc nếu có và environmentVariablescác cài đặt trong launcher.json sẽ ghi đè các biến môi trường.

Làm thế nào để Host.CreateDefaultBuilderlàm việc?

.NET Core 3.0 được thêm vào Host.CreateDefaultBuildertrong các tiện ích mở rộng nền tảng sẽ cung cấp khởi chạy mặc định trong IConfigurationđó cung cấp cấu hình mặc định cho ứng dụng theo thứ tự sau:

  1. appsettings.jsonbằng cách sử dụng nhà cung cấp cấu hình JSON .
  2. appsettings.Environment.jsonbằng cách sử dụng nhà cung cấp cấu hình JSON . Ví dụ:
    • appsettings.Production.json hoặc là
    • appsettings.Development.json
  3. Bí mật của ứng dụng khi ứng dụng chạy trong môi trường Phát triển.
  4. Các biến môi trường sử dụng trình cung cấp cấu hình Biến môi trường .
  5. Đối số dòng lệnh sử dụng trình cung cấp cấu hình dòng lệnh .

Đọc thêm - Tài liệu MS


Cảm ơn, nó là tốt nhưng Làm thế nào để làm điều đó với quy trình bàn điều khiển (hoặc khuôn mẫu quy trình công nhân / giàn giáo)?
hB0

44

Trong ASP.NET Core, bạn nên sử dụng Biến môi trường thay vì xây dựng cấu hình cho appsettings.json thích hợp

  1. Nhấp chuột phải vào bạn dự án> Thuộc tính> Gỡ lỗi> Biến môi trường

    biến môi trường

  2. ASP.NET Core sẽ sử dụng tệp appsettings.json thích hợp:

    ví dụ về các tệp cài đặt ứng dụng trong trình khám phá giải pháp

  3. Bây giờ bạn có thể sử dụng Biến môi trường đó như sau:

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

Lưu ý : Nếu bạn sử dụng câu trả lời của @ Dmitry , bạn có thể gặp sự cố, ví dụ: khi ghi đè các giá trị appsettings.json trên Azure.


35

Bạn có thể sử dụng các biến môi trường và ConfigurationBuilderlớp trong hàm tạo của mình Startupnhư sau:

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

Sau đó, bạn tạo một appsettings.xxx.jsontệp cho mọi môi trường bạn cần, với "xxx" là tên môi trường. Lưu ý rằng bạn có thể đặt tất cả các giá trị cấu hình chung vào appsettings.jsontệp "bình thường" của mình và chỉ đặt nội dung cụ thể của môi trường vào các tệp mới này.

Bây giờ bạn chỉ cần một biến môi trường được gọi ASPNETCORE_ENVIRONMENTvới một số giá trị môi trường cụ thể ("live", "staging", "production", bất cứ điều gì). Bạn có thể chỉ định biến này trong cài đặt dự án cho môi trường phát triển của mình và tất nhiên bạn cũng cần đặt biến này trong môi trường dàn dựng và sản xuất của mình. Cách bạn thực hiện ở đó tùy thuộc vào loại môi trường này.

CẬP NHẬT: Tôi vừa nhận ra rằng bạn muốn chọn appsettings.xxx.jsondựa trên cấu hình bản dựng hiện tại của mình . Điều này không thể đạt được với giải pháp đề xuất của tôi và tôi không biết liệu có cách nào để làm điều này hay không. Tuy nhiên, cách "biến môi trường" hoạt động và cũng có thể là một thay thế tốt cho cách tiếp cận của bạn.


Tôi đã xem xét việc sử dụng các biến môi trường, trong phần thuộc tính dự án-> gỡ lỗi, tuy nhiên không có cách nào rõ ràng rằng điều này sẽ thay đổi như thế nào dựa trên cài đặt dự án. Đó có phải là một tệp khác mà tôi có thể thêm vào dự án của mình để xử lý nó không?
tweetypi

Đặt biến trong thuộc tính dự án sẽ chỉ hoạt động khi sử dụng nó trong môi trường phát triển của bạn (có thể là Visual Studio). Bạn sẽ cần đặt nó ở nơi khác cho các ứng dụng đã triển khai của mình tùy thuộc vào môi trường cụ thể (IIS, Azure). Tôi không khuyên bạn nên đặt biến trong một số tệp cấu hình vì tệp này cũng có thể được triển khai và sau đó ghi đè các giá trị máy chủ.
Onkel Toob

Bạn thiết lập nó trong cấu hình xây dựng. Nếu không có một tập tin cấu hình xây dựng sau đó họ đang làm nó bằng tay, vì vậy họ sẽ cần phải thiết lập nó trong (cổ) triển khai hồ sơ
Nick Turner

Tôi có nhiều môi trường như thử nghiệm, dàn dựng và sản xuất trong Azure. Tôi phải thay đổi biến ASPNETCORE_ENVIRONMENT ở đâu nếu tôi muốn xuất bản phiên bản phát hành của ứng dụng web từ VS sang Azure?
băng giá

Chúng tôi không thay đổi các biến trong quá trình triển khai, thay vào đó, chúng được tích hợp sẵn trong môi trường cụ thể. Trong Azure, bạn có thể đặt các giá trị này trực tiếp trong cấu hình dịch vụ ứng dụng của mình trong "Cài đặt ứng dụng". Đừng quên đánh dấu chúng là "Cài đặt vị trí triển khai" trong trường hợp bạn đang làm việc với nhiều vị trí.
Onkel Toob

29

Chỉ là bản cập nhật cho người dùng .NET core 2.0, bạn có thể chỉ định cấu hình ứng dụng sau cuộc gọi tới 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
Làm thế nào để bạn chuyển đổi giữa các môi trường đang được sử dụng? Có những thay đổi nào được thực hiện trong bất kỳ tệp cấu hình nào không? Tôi hiểu rằng tôi sẽ cần thêm URL tôi muốn sử dụng khi dự án chạy trên Azure vào appsettings.json và URL tôi muốn thực thi khi chạy cục bộ (bằng F5) vào appsettings.Development.json . Đúng không? Chuỗi của tôi mà tôi muốn sử dụng nằm trong tệp launcherSettings.json và tôi hơi không rõ về cách thay đổi nó dựa trên vị trí ứng dụng được thực thi (hoặc nếu nó được cho là phải được thay đổi).
DonkeyBanana

3
@DonkeyBanana Môi trường không hơn gì một cài đặt được chỉ định trong các thuộc tính của dự án. Trong VS 2017, nhấp chuột phải vào dự án> thuộc tính. Trong phần gỡ lỗi, bạn sẽ thấy môi trường hiện tại cho khóa ASPNETCORE_ENVIRONMENT. Giá trị là những gì sẽ được thay thế cho ctx.HostingEnvironment.EnvironmentName}. Vì vậy, nếu bạn đặt giá trị đó trong thuộc tính thành 'Sản xuất', dự án sẽ tìm kiếm config.Production.jsontệp trong thư mục gốc. Để biết thêm thông tin, vui lòng xem liên kết
umutesen

Tạo ra một Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) trong WebHost.CreateDefaultBuiler (...
Hecatonchires

Cần lưu ý rằng ở đây nó nói rằng "AddJsonFile được tự động gọi hai lần khi bạn khởi tạo một trình tạo máy chủ mới với CreateDefaultBuilder". Nói cách khác, nó đang tải appSettings.json và sau đó dựa trên cấu hình môi trường của bạn, nó đang tải các cài đặt ứng dụng. {Environment} .json
David Yates

13
  1. Tạo nhiều tệp như:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. Tạo một sự kiện xây dựng trước trên dự án sao chép tệp tương ứng vào appSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. Chỉ sử dụng appSettings.jsontrong Trình tạo cấu hình của bạn:

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

Đây phải là một câu trả lời được chấp nhận. Đối với những trường hợp phức tạp có thể sử dụng SlowCheetah .
Anton K nhámlov

8

Bạn có thể thêm tên cấu hình như ASPNETCORE_ENVIRONMENTtrong launchSettings.jsonnhư sau

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

2

Đây là phiên bản phù hợp với tôi khi sử dụng ứng dụng bảng điều khiển mà không có trang 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);

0

Tệp .vscode / khởi chạy.json chỉ được sử dụng bởi Visual Studio cũng như tệp /Properties/launchSettings.json. Không sử dụng các tệp này trong sản xuất.

Tệp khởi chạySettings.json:

  1. Chỉ được sử dụng trên máy phát triển cục bộ.
  2. Không được triển khai.
  3. chứa cài đặt hồ sơ.

    • Các giá trị môi trường được đặt trong khởi chạySettings.json ghi đè các giá trị được đặt trong môi trường hệ thống

Để sử dụng tệp 'appSettings.QA.json' chẳng hạn. Bạn có thể sử dụng 'ASPNETCORE_ENVIRONMENT'. Làm theo các bước dưới đây.

  1. Thêm một Biến môi trường mới trên máy chủ và gọi nó là 'ASPNETCORE_ENVIRONMENT'. Đặt giá trị của nó thành 'QA'.
  2. Tạo tệp 'appSettings.QA.json' trong dự án của bạn. Thêm cấu hình của bạn ở đây.
  3. Triển khai vào máy ở bước 1. Xác nhận 'appSettings.QA.json' được triển khai.
  4. Tải trang web của bạn. Mong rằng appSettings.QA.json sẽ được sử dụng ở đây.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.