網站首頁 編程語言 正文
前言
多環境配置應該都很熟悉了,最為常見的環境便是Debug和Release,例如下圖是新建的一個asp.net項目,配置文件展開共有三個文件組成
有些開發者從來沒了解過Web.Debug.config和Web.Release.config,始終是一個Web.config文件改來改去來切換不同的配置,但凡有點追求都不能忍受這種煎熬。
asp.net下的多環境配置
雙擊打開Web.Debug.config和Web.Release.config任何一個,看看里面的內容。
Web.Debug.config
<?xml version="1.0" encoding="utf-8"?> <!-- 有關使用 Web.config 轉換的詳細信息,請訪問 https://go.microsoft.com/fwlink/?LinkId=301874 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!-- 在下例中,“SetAttributes”轉換將更改 “connectionString”的值,僅在“Match”定位器找到值為“MyDB”的 特性“name”時使用“ReleaseSQLServer”。 <connectionStrings> <add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> --> <system.web> <!-- 在以下示例中,"Replace" 轉換將替換 Web.config 文件的 整個 <customErrors> 節。 請注意,由于在 <system.web> 節點下只有一個 customErrors 節,因此無需使用 "xdt:Locator" 屬性。 <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly" xdt:Transform="Replace"> <error statusCode="500" redirect="InternalError.htm"/> </customErrors> --> </system.web> </configuration>
微軟為了讓我們使用它,把不僅給出示例,還配上詳細的注釋,看過注釋和示例大概就該知道如何進行配置,覆蓋Web.config中的配置。
下面展示下最為常用的appSettings如何配置
<!--Web.config 開發環境--> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="MyKey" value="Myvalue" /> </appSettings>
<!--Web.Release.config 生產環境--> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="MyKey" value="Releasvalue" xdt:Transform="Replace" xdt:Locator="Match(key)" /> </appSettings>
經過這樣的配置后,本機開發時讀取到MyKey的值為Myvalue,發布生產環境時值為Releasvalue。
按照上面的配置,本地發布程序試試效果。
發布成功后,打開發布后生成的Web.config文件,我們發現開發環境下Web.config中對應的值被替換了,這樣開發和生產配置分別配置在不同文件,不需要頻繁修改配置文件切換配置了。
如何增加額外的環境配置
有時候Debug和Release兩個環境還不能滿足我們的需要,需要增加更多的環境配置。
打開菜單生成-->配置管理器,新建一個TEST1
環境
然后右鍵Web.config選擇添加配置轉換(第四個)
會自動生成一個Web.TEST1.config文件,非常的人性化,然后我們在該文件配置一些參數。
更改發布的配置,進行發布。
打開發布成功后的Web.config
文件
效果與預期一致。
aspnetcore下的多環境配置
aspnetcore中的配置文件被appsettings.json
所取代,.NET Core中的配置是使用一個或多個配置提供程序執行的。 配置提供程序使用各種配置源從鍵值對讀取配置數據:
什么是配置提供程序
下表顯示了 .NET Core 應用可用的配置提供程序。
提供程序 | 通過以下對象提供配置 |
---|---|
Azure 應用配置提供程序 | Azure 應用程序配置 |
Azure Key Vault 配置提供程序 | Azure Key Vault |
命令行配置提供程序 | 命令行參數 |
自定義配置提供程序 | 自定義源 |
環境變量配置提供程序 | 環境變量 |
文件配置提供程序 | JSON、XML 和 INI 文件 |
Key-per-file 配置提供程序 | 目錄文件 |
內存配置提供程序 | 內存中集合 |
應用機密(機密管理器) | 用戶配置文件目錄中的文件 |
詳細內容參考 .NET 中的配置
https://docs.microsoft.com/zh-cn/dotnet/core/extensions/configuration
其中以下部分比較值得注意
劃重點:后來添加的配置提供程序會替代之前的密鑰設置appsettings.Development.json
比appsettings.json
后加載,則后加載的會覆蓋先加載配置的值,沒毛病!
多環境配置文件時如何加載
為了徹底弄清楚底層加載邏輯,下載源碼一探究竟。
builder.ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { if (!string.IsNullOrEmpty(env.ApplicationName)) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { config.AddUserSecrets(appAssembly, optional: true); } } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } })
默認的WebHostBuilder
實現中,用環境變量env.EnvironmentName
值拼接的json文件進行加載。這也是為什么開發階段會加載appsettings.Development.json
配置文件的原理。
開發階段的多環境
如何傳參修改環境變量EnvironmentName
值是問題的關鍵,若能修改想要的值,然后創建對應名稱的配置文件即可。
在web根目錄存在一個文件:Properties/launchSettings.json
其中有一個配置環境變量的配置
"environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" },
本地開發時只需要創建多個啟動配置,分別設置不同的ASPNETCORE_ENVIRONMENT即可進行切換了,修改后的launchSettings.json
// launchSettings.json { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:2364", "sslPort": 44302 } }, "profiles": { "Web1": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true }, "Web1:Test": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "TEST" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true } } }
Web1和Web1:Test啟動選項便會同步顯示在VS啟動選項中,切換為Web1:Test再運行程序,就會加載appsettings.TEST.json
,效果和appsettings.Development.json
沒區別。
發布階段的實現多環境配置
在上文中我們學會了在本地配置多個不同環境配置進行開發,那如果需要發布的生產環境也有很多種配置,那如何讓程序自動加載不同的配置文件呢,畢竟launchSettings.json
文件只是在開發時搭配VS用的,既然launchSettings.json
可以配置環境變量,沒了它我們手動創建環境變量應該也可以。在操作系統添加環境變量如:
也可以在程序啟動時通過命令行傳參設置環境值。
但是這兩種我都感覺不方便,我們希望程序根據不同的環境發布好以后,只需要直接執行就好,而不是需要進行額外的配置或傳參。
EnvironmentName 屬性
在項目的工程文件中有EnvironmentName屬性,可以指定當前EnvironmentName值,添加如下代碼
然后編譯后的,直接運行,就能夠讀取到appsettings.TEST.json
配置文件。
這配置不會覆蓋launchSettings.json
中指定的環境值,但在影響發布后的EnvironmentName值,從而可以改變實現發布后默認的EnvironmentName值。
那這樣設置后,豈不是發布后的EnvironmentName值只能是Test,如果要發布其他環境還要每次發布前修改這個值,那不是很麻煩嗎?
沒錯如果沒有點其他手段,那這真是多此一舉啊,請看下圖。
懂了吧,我們只需要多配置一個PublishProfile發布文件,指定不同的配置項,然后結合Condition條件來控制EnvironmentName。
至此,完美實現根據不同環境選擇不同的發布文件,進行發布項目,目標機器不需要做任何配置,直接運行就是我們想要的效果。
總結雖然ASP.NET和ASP.NETCore實現多環境的方式不同,但是最后發布時我們可以做到一樣的效果,所有的配置都是一次性的,發布時指定對應的PublishProfile即可。
總結
原文鏈接:https://www.cnblogs.com/springhgui/p/16154573.html
相關推薦
- 2022-10-15 Qt鍵盤事件實現圖片在窗口上下左右移動_C 語言
- 2022-12-14 深入了解Rust中trait的使用_Rust語言
- 2022-07-27 Go?error的使用方式詳解_Golang
- 2023-06-19 Python進行文件處理的示例詳解_python
- 2022-05-06 React自定義Hook-useForkRef的具體使用_React
- 2022-10-28 React?createElement方法使用原理分析介紹_React
- 2022-10-27 Python?標準庫?fileinput與文件迭代器_python
- 2023-03-27 Android?Framework原理Binder驅動源碼解析_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支