.NET Core / .NET Fx 應用程式如何在開發環境使用環境變數

組態設定除了存放在 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 的結構有點不太一樣,可以參考以下文章得到比較詳細的做法

From VS to VS Code with .NET Core | Autodesk Forge

他可以不用上版控

 

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

Image result for microsoft+mvp+logo