.NET Core配置多環(huán)境

9141961-1.png

配置多環(huán)境是日常開發(fā)經(jīng)常需要用到的操作旺韭,實現(xiàn)多環(huán)境配置后可以規(guī)避生產(chǎn)測試環(huán)境混合帶來的麻煩和風(fēng)險,減少項目風(fēng)險,并且也可以通過多環(huán)境來保證生產(chǎn)環(huán)境上密鑰的安全。

我之前在做iOS開發(fā)時市栗,iOS的解決方法是通過多個配置不同環(huán)境變量,并且配合來實現(xiàn)不同的環(huán)境啟動時咳短,讀取不同的配置填帽,在.NET Core中當然也會有類似的這種方式,并且它比iOS中更簡單咙好,只需要注入不同的環(huán)境變量即可篡腌,而iOS還需要建立多個Target才能實現(xiàn)注入不同的環(huán)境變量,.NET Core則可以直接在啟動時注入不同的環(huán)境變量勾效,根本無需再做其它操作嘹悼。

方式一:預(yù)編譯指令DEBUG

#if DEBUG
            //讀取環(huán)境1配置文件
#else
            //讀取環(huán)境2配置文件
#endif

如果你只有兩套環(huán)境,這種方式也勉強夠用层宫,在日常開發(fā)中杨伙,我們基本上都是DeBug模式運行的,在生產(chǎn)環(huán)境發(fā)布的代碼卒密,也基本上都是編譯的Release代碼缀台,所以使用預(yù)編譯指令#if DEBUG即可以滿足這種需求,而且這種操作方式非常簡單哮奇,只需要準備兩個不同的配置文件來給兩個不同環(huán)境讀取即可膛腐。

    /// <summary>
    /// 全局配置管理類(按照DEBUG/RELEASE區(qū)分環(huán)境)
    /// </summary>
    public static class MyConfiguration
    {
        public static IConfiguration Configuration { get; set; }
        static MyConfiguration()
        {
        #if DEBUG
            var envPath = "appsettings.Development.json";
        #else
            var envPath = "appsettings.json";
        #endif
            Configuration = new ConfigurationBuilder()
                .Add(new JsonConfigurationSource
                {
                    Path = envPath,
                    ReloadOnChange = true
                }).Build();
        }
    }

但是如果你想調(diào)試生產(chǎn)環(huán)境或者想實現(xiàn)兩個以上的環(huán)境的話睛约,那么就只能使用第二種方式了。

方式二:注入不同環(huán)境變量

首先準備好你不同環(huán)境的配置文件哲身,例如:


----_20190214135843

然后選擇啟動項目Properties下的launchSettings.json文件硬耍,添加如下配置:

{
  "profiles": {
    "240": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev240"
      }
    },
    "241": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev241"
      }
    },"243": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev243"
      }
    },"Staging": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

此時,啟動選擇已然變成這樣:


----_20190214140432

當然砚哗,我們也可以直接在啟動項目的Properties里面改右蕊,如下圖:

----_20190214140748-1

當然環(huán)境變量配置好了之后,我們就需要來使用環(huán)境變量脯丝,新建一個配置的工具類文件:

    /// <summary>
    /// 全局配置管理類(適配多環(huán)境)
    /// </summary>
    public static class MyConfigurationHelper
    {
        public static IConfiguration Config { get; set; }
        static MyConfigurationHelper()
        {
            var env = MyServiceProvider.ServiceProvider.GetRequiredService<IHostingEnvironment>();
            Config = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true)
                .Build();
        }

    }

   public static class MyServiceProvider
    {
        public static IServiceProvider ServiceProvider { get; set; }
    }

這個文件中提供了一個讀取配置IConfigurationMyConfigurationHelper類和一個提供IServiceProvider容器的MyServiceProviderIServiceProvider是.NET Core中的服務(wù)容器商膊,他能夠訪問到程序注入的環(huán)境變量,然后進入Startup.cs中引用這個文件宠进,并且在Configure方法中晕拆,將IApplicationBuilderApplicationServices傳遞進去。

   public void Configure(IApplicationBuilder app, IHostingEnvironment env)
   {
        //配置多環(huán)境
        MyServiceProvider.ServiceProvider = app.ApplicationServices;
   }

這時材蹬,我們回過去看MyConfigurationHelper類实幕,它將會在下一次被使用時,從IServiceProvider中讀取我們選擇的啟動環(huán)境對應(yīng)的環(huán)境變量字符串Dev240堤器、Dev241昆庇、Dev243Staging闸溃;從而實現(xiàn)讀取不同的配置文件與IConfiguration``Config中整吆,我們后繼使用讀取配置文件的操作時,都將使用MyConfigurationHelper.Config來進行讀取圈暗。

發(fā)布時區(qū)分多環(huán)境

在Liunx上面掂为,我們使用supervisor來守護我們的.NET Core應(yīng)用程序,所以我們想要運行哪個環(huán)境员串,就可以在supervisor的項目配置中進行配置勇哗,修改/etc/supervisord.d/下的配置文件鍵入環(huán)境變量如下:

# /etc/supervisord.d/DotNetCoreTest.ini
[program:DotNetCoreTest]
directory=/xxx/DotNetCoreTest
command=dotnet DotNetCoreTest.dll
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/xxx/logs/DotNetCoreTest.log
# 環(huán)境變量
environment=ASPNETCORE_ENVIRONMENT=Dev240

方式一在發(fā)布時只需要編譯Release就能自動讀取對應(yīng)環(huán)境的配置文件,無需上面的操作寸齐。

如果有問題或者很喜歡欲诺,歡迎在下面留言評論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渺鹦,一起剝皮案震驚了整個濱河市扰法,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毅厚,老刑警劉巖塞颁,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡祠锣,警方通過查閱死者的電腦和手機酷窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伴网,“玉大人蓬推,你說我怎么就攤上這事≡杼冢” “怎么了沸伏?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長动分。 經(jīng)常有香客問我毅糟,道長,這世上最難降的妖魔是什么刺啦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任留特,我火速辦了婚禮纠脾,結(jié)果婚禮上玛瘸,老公的妹妹穿的比我還像新娘。我一直安慰自己苟蹈,他們只是感情好糊渊,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慧脱,像睡著了一般渺绒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱鸥,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天宗兼,我揣著相機與錄音,去河邊找鬼氮采。 笑死殷绍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鹊漠。 我是一名探鬼主播主到,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躯概!你這毒婦竟也來了登钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娶靡,失蹤者是張志新(化名)和其女友劉穎牧牢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡塔鳍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年度陆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献幔。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡懂傀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡感,到底是詐尸還是另有隱情蹬蚁,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布郑兴,位于F島的核電站犀斋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏情连。R本人自食惡果不足惜叽粹,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望却舀。 院中可真熱鬧虫几,春花似錦、人聲如沸挽拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螃诅。三九已至啡氢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术裸,已是汗流浹背倘是。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袭艺,地道東北人搀崭。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像匹表,于是被迫代替她去往敵國和親门坷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 在茫茫路途中追尋 也不知道是否有望 冰冷兇殘的猛獸 口中涼水洶涌 你說 暗戀我的男孩子啊 多么敏銳而小心翼翼 我在...
    舜若多閱讀 251評論 4 3
  • 今天是6袍镀。1兒童節(jié)默蚌。為期30天的好報寫作第四期,將在明天告一段落苇羡。這意味著绸吸,咱們組成的寫作小組——好報寫作六組將...
    筱筱凡閱讀 578評論 1 2
  • 竹外桃花三兩枝,春江水暖鴨先知。 蔞蒿滿地蘆芽短锦茁,正是河豚欲上時攘轩。 清晨6點半,伴著鬧鈴美妙的聲音码俩,起床洗漱和老公...
    蝴蝶王妃閱讀 739評論 0 2