﻿# 介紹幾個 .NET SDK、.NET CLI 與 .NET runtime 執行時的好用環境變數總整理

我在 [Environment variables used by .NET SDK, .NET CLI, and .NET runtime](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables?WT.mc_id=DT-MVP-4015686) 這篇文章中看到幾個很有機會用到的環境變數設定，有些在容器中常用，有些在 CI 的時候常用，我覺得先整理起來，以後有機會就可以用上！

![environment](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/189a082816cc2c58b125-216737417-bc4cf3c0-59e3-4a1c-a7ef-7e4253daebb6.jpg)

-   `DOTNET_ROOT`
    
    當你安裝 .NET SDK 到**系統層級**的時候，這個環境變數沒啥用處，因為有預設值。Windows 預設路徑在 `C:\Program Files\dotnet`，而 Linux 與 macOS 預設路徑在 `/usr/share/dotnet`！
    
    但是當你安裝在**使用者層級**的時候，這個環境變數就非常重要，沒有這個很容易會導致程式無法執行，像我在 Linux 環境下安裝 .NET SDK 就不太喜歡安裝到**系統層級**，所以我就會在 `~/.profile` 特別加入 `DOTNET_ROOT` 環境變數設定，指向到 `~/dotnet` 資料夾！
    
-   `NUGET_PACKAGES`
    
    由於本機的 NuGet 套件快取，主要跟「使用者」有關，所以快取的目錄都是個人化的。
    
    Windows 的預設路徑為 `%userprofile%\.nuget\packages`，且不太常改，除非你的 C 槽快滿了，就可以透過調整這個環境變數來換掉預設的 NuGet 快取資料夾路徑。
    
    Linux 與 macOS 的預設路徑為 `~/.nuget/packages`，通常也不太需要修改。
    
-   `DOTNET_NOLOGO`
    
    當你在剛安裝好 .NET SDK/Runtime 的時候，第一次執行 `dotnet` 命令，就會出現「第一次執行的相關說明」，而且只會出現一次，所以在 CI 的時候出現這個訊息就很沒意義，建議設定為 `1` 即可，設定完成後就不會再次出現這類訊息。
    
    > 請注意: 這個環境變數在 .NET Core 3.x 的時候，環境變數的名稱是 `DOTNET_SKIP_FIRST_TIME_EXPERIENCE` 喔，是從 .NET 5 才改為 `DOTNET_NOLOGO` 環境變數名稱的！
    
-   `DOTNET_GENERATE_ASPNET_CERTIFICATE`
    
    大家可能不知道 .NET SDK/Runtime 的 `dotnet` 執行檔在首次執行的時候會自動產生一個開發用自簽憑證，但是如果你正在安裝的環境是一個未來需要轉發(Redistribute)的容器映象(Container image)或虛擬機器(VM)，你就不應該建立這個自簽憑證，因為自簽憑證預設只有一年效期。你只要在安裝好 .NET SDK/Runtime 之後，設定這個 `DOTNET_GENERATE_ASPNET_CERTIFICATE` 環境變數，並將其值設為 `false` 即可避免產生自簽憑證！
    
-   `DOTNET_CLI_TELEMETRY_OPTOUT`
    
    .NET SDK/Runtime 預設會啟用 Telemetry (遙測) 機制，分析一般人使用 .NET CLI 的基礎統計資訊，許多公司也會特別關閉這類遙測訊息，以確保資訊安全。我通常會在 CI 或程式跑在容器時關閉這個機制，因此建議設定為 `1` 即可。
    
-   `DOTNET_ROLL_FORWARD`
    
    > 決定你要如何選擇 .NET SDK 版本，這部分講解過於複雜，建議先閱讀我之前的 [使用 global.json 精準的選擇 .NET SDK 版本](/post/2021/06/04/Choose-the-right-DotNet-SDK-version-using-global-json) 文章之後，再來做設定。
    
    基本上你可以設定的值可以是：`patch`, `feature`, `minor`, `major`, `latestPatch`, `latestFeature`, `latestMinor`, `latestMajor`, `disable`
    
-   `DOTNET_ROLL_FORWARD_TO_PRERELEASE`
    
    > 決定你要如何選擇 .NET SDK 版本，這部分講解過於複雜，建議先閱讀我之前的 [使用 global.json 精準的選擇 .NET SDK 版本](/post/2021/06/04/Choose-the-right-DotNet-SDK-version-using-global-json) 文章之後，再來做設定。
    
    這個預設值為 `0` (Disabled)，你也可以設定為 `1` 來讓 .NET SDK/Runtime 選用 Prerelease 版本。
    
-   `DOTNET_CLI_UI_LANGUAGE`
    
    可以設定 .NET CLI 命令列環境的顯示語言版本，預設為 `en-us` 英文，但如果你的電腦意外顯示成中文，就可以設定這個環境變數來決定 `dotnet` 命令執行時選用的語言翻譯。
    
    設定值為 `zh-tw` 可以顯示正體中文，使用 `en-us` 就可以強迫顯示英文。
    
-   `DOTNET_BUNDLE_EXTRACT_BASE_DIR`
    
    .NET Core 在部署的時候，可以用以下命令發行成單一檔案，大幅簡化日後部署的難度。
    
    ```bash
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    ```
    
    從 .NET Core 3.0 開始就有這個功能，不過這個功能非常陽春，他骨子裡其實是把要部署的幾百個檔案壓縮成一個檔案而已，執行的時候其實還是需要先「解壓縮」到一個**暫存目錄**才能跑起來的，而這個**暫存目錄**非常的隱蔽不好找，久而久之可能會大量耗用你的硬碟空間！
    
    如果你想自行決定解壓縮的路徑，可以設定這組環境變數！ 👍
    

其他環境變數應該就很少用了，我自己也沒用過，更想不太到使用情境，有興趣看完整版可以參考以下相關連結！

### 相關連結

-   [Environment variables used by .NET SDK, .NET CLI, and .NET runtime - .NET CLI | Microsoft Docs](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables?WT.mc_id=DT-MVP-4015686)
-   [Enforce HTTPS in ASP.NET Core | Microsoft Learn](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-7.0&WT.mc_id=DT-MVP-4015686&tabs=visual-studio)
-   [dotnet watch command - .NET CLI | Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-watch?WT.mc_id=DT-MVP-4015686#environment-variables)
-   [What's new in .NET Core 3.0 | Microsoft Docs](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0)
-   [如何在 Ubuntu Linux 解除安裝 .NET SDK 或 Runtime 任意版本](/post/2021/09/16/How-to-uninstall-NET-SDK-Runtime-in-Ubuntu-Linux)
-   [.NET 5.0 `dotnet` 主程式的 Program.cs 原始碼中關於環境變數的程式碼](https://github.com/dotnet/sdk/blob/v5.0.401/src/Cli/dotnet/Program.cs#L187-L194)
