iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
DevOps

.NET Core 專案持續整合與部署系列 第 11

Integrate:Environments

在《Continuous Delivery》一書中,有表達一個概念,就是理想的軟體應該與設置分開,任何環境應該使用的是同一套建置出來的應用程式,而不應該在 Development 環境使用的是一套、Production 使用的是一套。

那今天就來研究一下怎樣讓使用同一個軟體可以在不一樣的環境執行吧!

以我們建立的 ASP.NET Core 專案為例,我們的主程式 Program.cs 是長這樣的:

namespace WebProj
{
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

WebHost.CreateDefaultBuilder() 去產生設定的程式碼如下:

ConfigureAppConfiguration((hostingContext, config) =>
{
    var env = hostingContext.HostingEnvironment;

    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); *// optional extra provider*

    if (env.IsDevelopment()) *// different providers in dev*
    {
        var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
        if (appAssembly != null)
        {
            config.AddUserSecrets(appAssembly, optional: true);
        }
    }

    config.AddEnvironmentVariables(); *// overwrites previous values*

    if (args != null)
    {
        config.AddCommandLine(args);
    }
});

依照上面的程式碼,我們可以得知去取得值的順序如下,後面的來源會覆蓋前面的值:

  1. appsettings.json
  2. appsettings.ENVIRONMENT.json
  3. User Secrets ( 僅 Development 環境 )
  4. 環境變數
  5. 命令列

所以我們就可以透過這些方式去輸入不同的設定,讓我們達到同一套建置出來的應用程式可以在不同的環境去執行。執於詳細的部分,礙於時間先在這裡打住,我會在這 30 天之中抽空出來將本篇補完。


上一篇
Integrate:Acceptance Testing
下一篇
Integrate:Publish Mode
系列文
.NET Core 專案持續整合與部署31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言