組態設定除了存放在 IO 檔案之外,存放在作業系統的環境變數則是選項之一,NET 提供 System.Envrionment.GetEnvironmentVariable、System.Environment.SetEnvironmentVariable 讓開發人員輕鬆的存取作業系統的環境變數,但是,開發一個應用程式就要動到作業系統的環境變數,還是挺麻煩的;要讓機密性的資料不上版控,還是會需要付出一些額外的成本,這是跑不掉的。
這一篇則是為了要紀錄了幾種在開發環境(VS IDE、Rider)下可以取得環境變數的方式而且不用動到程式碼。
開發環境
- Windows 11 Pro
- .NET 6
- Rider 2021.3-EAP9-213.5744.160)
使用環境變數的好處
- 避免機密性資料上版控
- 整合容器
實作
.NET Core / .NET Fx 都有提供 System.Envrionment.GetEnvironmentVariable 讓我們讀取環境變數,我想要在開發環境仍然可以使用這些環境變數,有哪些方法可以設定環境變數
作業系統環境變數
作業系統等級環境變數有分個人、系統等級,系統等級需要管理員身分。
下圖為設定介面
或是透過命令提示字元、Powsershell 設定系統環境變數,以下範例是系統等級,需要管理員權限
命令提示字元:
setx APP_ENV Production /M
Powsershell:
[Environment]::SetEnvironmentVariable("APP_ENV", "QA", "Machine")
launchSettings.json
.NET Core 的應用程式可以讓 IDE 透過 launchSettings.json 讀取到環境變數
VS IDE、Rider 可以套用 environmentVariables 結構
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"Lab.Environment.ConsoleApp.NET6": {
"commandName": "Project",
"environmentVariables": {
"APP_ENV":"QA"
}
}
}
}
VS Code 的結構有點不太一樣,可以參考以下文章得到比較詳細的做法
他可以不用上版控
CommandLine
透過命令提示字元、Powsershell 設定環境變數,再打開 IDE
命令提示字元:
set APP_ENV=QA
cd "C:\Users\Yao Chang Yu\scoop\apps\Rider-EAP\current\IDE\bin\"
rider64.exe
Powsershell:
$Env:APP_ENV = "QA"
cd "C:\Users\Yao Chang Yu\scoop\apps\Rider-EAP\current\IDE\bin\"
./rider64.exe
這時候專案就可以讀到環境變數了
下圖是 .NET Fx 4.8
下圖是 .NET 6
接著,把它變成 Lab.Environment.ps1,這樣開專案就方便多了
$Env:APP_ENV = "QA"
./Lab.Environment.sln
有幾點要注意下
- 這個檔案不能上版控
- 區分系統環境變數名稱,以免開多個方案時,變數打架,蓋來蓋去
Task
task 是一個跨平台的命令呼叫,跟 Powsershell 一樣的意思,不需要依賴 .NET Core Runtime
go-task/task: A task runner / simpler Make alternative written in Go (github.com)
安裝
scoop install task
在方案路徑新增 taskfile.yml,內容如下:
dotenv 會去讀 secrets.env
version: "3"
dotenv: ["secrets.env"]
tasks:
rider:
desc: Rider
cmds:
- rider64.exe
env:
Url: http://localhost:9527
新增 secrets.env 檔案,內容如下:
APP_ENV=QA
目錄結構如下:
用 Powsershell 執行
task rider
secrets.env 不要上版控
保護機密組態還有其他作法
如何使用應用程式秘密組態 | 余小章 @ 大內殿堂 - 點部落 (dotblogs.com.tw)
範例位置
sample.dotblog/Configuration/Lab.Environment at master · yaochangyu/sample.dotblog (github.com)
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET