The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

在 Visual Studio 2022 開發 ASP.NET Core 這樣設定就對了!

其實我大部分時間都在 Visual Studio Code 裡面做開發,久而久之就生疏了 Visual Studio 2022 裡面的各種選項設定,有很多都是近幾年才有的新功能,而有些「預設值」確實不太好用,只要沒特別去研究,就不知道原來只要微調一下就會變的非常方便。這篇文章我就來整理一下 Visual Studio 2022 在開發 ASP.NET Core 時相關的那些重要設定。

vs2022-asp-net-core-tips

啟動但不偵錯 (Start Without Debugging)

我常常跟上我課的學員分享,我寫程式幾乎不進偵錯模式,因為啟動速度太慢了,所以幾乎都不 Debug 的。所以我每次在開發 ASP.NET Core 的時候,都是使用 啟動但不偵錯 (Start Without Debugging) 的方式開啟網站,快速鍵是 Ctrl + F5,這樣 Visual Studio 2022 就不會進入偵錯模式,而是直接啟動網站,速度快很多。

SNAG-0085

自動啟動瀏覽器

這個部分並不是 Visual Studio 2022 的設定,而是 ASP.NET Core 在啟動網站時的設定。

由於在 ASP.NET Core 預設的專案範本中,都會有一個 Properties/launchSettings.json 檔案,在這份設定檔中,主要有三個區塊,分別是:

  1. $schema (宣告這份文件的 JSON Schema URL,用來讓 Visual Studio 2022 能夠提供 JSON 文件的 Intellisense)
  2. iisSettings (宣告使用 IIS Express 裝載網站時的 IIS 站台設定)
  3. profiles (宣告各種不同的啟動設定檔,例如 httpIIS Express 等等)
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
  },
  "profiles": {
    "http": {
    },
    "IIS Express": {
    }
  }
}

由於預設有兩個啟動設定檔,分別是 http (或 https) 和 IIS Express

  1. http 設定檔

    這個設定檔主要給使用 .NET CLI 直接啟動 ASP.NET Core 時使用,這種啟動方法會開啟一個 Console (命令提示字元) 視窗。

  2. IIS Express 設定檔

    這個設定檔主要給使用 IIS Express 裝載並啟動 ASP.NET Core 應用程式時使用,這種啟動方法不會有 Console 視窗,所以你會看不到 Console 的訊息。

這兩個設定檔都有一個 launchBrowser 屬性,且屬性預設是 true,這個設定會你在按下 Ctrl+F5 (啟動但不偵錯) 時,每次都會開啟瀏覽器頁籤,在自動重整網站時也會自動開啟瀏覽器頁籤,如果只開一次的話,當然是很貼心,但第二次按下 Ctrl+F5 (啟動但不偵錯) 時,又開一個新的頁籤就很煩人了!

所以,要不要關掉呢?答案是:維持預設值!開著!因為我稍後會說明最完美的設定方法!

SNAG-0087

[工具] -> [選項] -> [專案和方案] -> [ASP.NET Core]

這裡的選項就是本篇文章的重點之處,好的設定讓你上天堂,好用的不要不要的!👍

我直接顯示我認為最完美的設定,照著設定就可以:

SNAG-0089

以下是每個選項的詳細解說:

  • 一般

    • 自動建置並重新整理瀏覽器 (Auto build and refresh option)

      選項用於在專案進行更改並執行 Web 伺服器時,自動建置並重新整理瀏覽器。這些設定適用於不支援熱重新載入已禁用熱重新載入的應用程式。

      這裡有 4 個選項:

      1. None
        不自動建置或重新整理瀏覽器
      2. Auto build on browser request (IIS only)
        在 IIS 上僅在瀏覽器請求時自動建置
      3. Refresh browser after build
        在建置後重新整理瀏覽器
      4. Auto build and refresh browser after saving changes
        在專案儲存更改後自動建置並重新整理瀏覽器

      我覺得最好的選項就是最後一個,因為在不支援 Hot Reload (熱重新載入) 的情況下,這個選項可以讓你在儲存檔案後,自動建置並重新整理瀏覽器,這樣就不用手動按 Ctrl+F5,同時也意味著不會自動開啟瀏覽器頁籤!👍

    • 建置後自動重新啟動 Kestrel 伺服器 (Auto restart Kestrel server after build: True)

      如果 Kestrel 伺服器在建置之前正在執行,則自動重新啟動 Kestrel 伺服器。

      這個選項肯定要打開,因為只要你先前正在執行的 Kestrel 還在執行時,所有的 *.dll 檔案會被鎖定,這會導致 Visual Studio 2022 會無法順利建置你的專案,只要經常不能建置,你一定會覺得很煩!啟用這個設定後,你在建置專案時,他就會去自動判斷目前是否有正在執行的 Kestrel 伺服器 (其實就是 ASP.NET Core 應用程式啦),如果有找到,就會自動幫你停止,然後再重新啟動,這樣就不會有檔案被鎖定的問題了!👍

    • CSS 熱重新載入 (CSS Hot Reload: Enabled)

      在編輯時啟用在瀏覽器中熱重新載入 CSS 更改。

      顧名思義,當你在 ASP.NET Core MVC 修改 CSS 的時候,網頁不用重新整理,更新後的 CSS 就會自動套用到網頁上,連專案都不用重新建置,非常的方便!👍

  • 輸出選項

    • 最小化啟動外部控制台 (Launch external console minimized)

      在外部 Console 中執行 ASP.NET Core Web 伺服器時,最小化或正常啟動。

      設定為 True 時,額外開啟的 Console 視窗會自動進行最小化,這樣就不會一直跳出來,影響你的工作。但如果你是像我一樣有時候有授課的需求,經常要跟學員展示 Console 的內容時,你也可以設定為 False,這樣每次 Kestrel 重新啟動時,這個 Console 視窗就會自動被提升到最前面顯示,你會優先看到 Console 的訊息內容。👍

    • 在以下位置執行 Web 伺服器 (Run web server in)

      在 Visual Studio 的整合終端或外部 Windows Console 中執行 ASP.NET Core Web 伺服器。

      這裡有 2 個選項:

      1. External Console (會額外開啟一個 Console 命令提示字元視窗)
      2. Integrated Terminal (會在 Visual Studio 裡面額外開啟一個新的窗格)

      你只要選擇 Integrated Terminal 就保證會煩死你,因為你每次重新啟動 Kestrel 他都會不斷開啟新的 Terminal 視窗,真的超級干擾的。所以保留預設值的 External Console 應該才是最佳選擇!👍

    • 使用共用的 Web 伺服器輸出視窗 (Use shared web server output window)

      將每個專案的 Web 伺服器輸出重定向到其自己的輸出視窗,或者交錯到共用的輸出視窗中。

      這個設定我完全看不懂怎麼用,測不出任何差異或有任何好處,不要動他即可。👎

[工具] -> [選項] -> [偵錯] -> [一般]

Hot Reload (熱重新載入) 是個好東西,請務必記得啟用他。只要啟用了這個 Enable Hot Reload 設定後,Visual Studio 2022 預設會監控你的整個專案,他會在你有修改任何 *.cs*.json 檔案時,自動重新載入正在執行的 ASP.NET Core 應用程式,這樣可以大幅減少重新建置重新啟動的時間!👍

SNAG-0107

不過,你在 Visual Studio 2022 幫你開啟的 Windows Console 視窗中,不一定會看到 Hot Reload 的訊息。在修改 appsettings.*.json 時,會顯示以下訊息:

dbug: Microsoft.AspNetCore.Server.Kestrel[0]
      Config reload token fired. Checking for changes...

但在修改 *.cs 的時候,就看不到 Hot Reload 的資訊了,但你可以在 Visual Studio 2022 的 Output 視窗中,選擇 Hot Reload 類別,這樣就可以看到 Hot Reload 的訊息了!

[工具] -> [選項] -> [偵錯] -> [.NET / C++ Hot Reload]

這裡是設定 Hot Reload 的一些相關選項,建議可以全部啟用,可以大幅改善 ASP.NET Core 的開發體驗!👍

SNAG-0110

  • 啟用熱重新載入 (Enable Hot Reload)

    這肯定要勾選!✅

  • 在不進行偵錯的情況下啟用熱重新載入 (Enable Hot Reload when starting without debugging)

    這個選項是在你按下 Ctrl+F5 (啟動但不偵錯) 時,是否要啟用 Hot Reload,這個選項當然也要勾選!✅

  • 在檔案儲存時應用熱重新載入 (Apply Hot Reload on File Save)

    這個選項是在你儲存檔案時,是否要啟用 Hot Reload,這個選項當然也要勾選!✅

  • 設定日誌詳細程度 (Logging verbosity: Minimal)

    這個選項是設定 Hot Reload 的日誌詳細程度,預設是 Minimal,這個設定就夠用了,不用再調整。👍

除了選項設定外,也有 Visual Studio 2022 的工具列也可以快速設定:

SNAG-0109

然而,並非所有的程式碼修改,都可以順利的套用 Hot Reload 機制,當無法套用的時候,就會出現以下對話框,建議勾選 Always rebuild when changes can't be applied 選項,他就不會再問你了,下次就會直接重新建置並自動啟動網站。不過這個選項不會保存下來,你只要重開 Visual Studio 2022 下次還是會再看到一次。

SNAG-0114

調整 REST API Editor 的「送出要求」快速鍵

從 Visual Studio 2022 的 v17.5 開始,就有內建一個超級好用的 REST API 編輯器 (REST API Editor),當我們要送出 HTTP 要求時,Visual Studio 2022 並沒有提示我們鍵盤的快速鍵是什麼,所以很多人並不知道可以透過 Ctrl+Alt+S 快速送出 HTTP 要求,常用的人可以記起來!

SNAG-0112

不過,我在 Visual Studio Code 也會用 .http 檔案,只要搭配 REST Client 擴充套件,就可以做到一樣的事。而我在 Visual Studio Code 那邊的快速鍵是 Ctrl+Enter,所以我習慣把 Visual Studio 2022 的快速鍵也設定為 Ctrl+Enter,這樣就不用記兩種快速鍵了!👍

事實上 Visual Studio Code 的 REST Client 擴充套件比 Visual Studio 2022 還好用,大家有興趣可以深入研究。

加入 .editorconfig 統一程式碼風格

Visual Studio 2022 預設的變數命名規則跟 ASP.NET Core 專案範本中的變數命名並不一致,我先前在 YouTube 有分享過一部 Visual Studio 2022 如何設定預設變數命名規則 教學影片,影片中有詳細的說明這個問題,也有分享設定的方法,由於設定過程有點複雜,建議大家看影片比較清楚!

以下是我設定好的畫面截圖:

Visual Studio 2022 > Options > Text Editor > C# > Code Style > Naming

但是每個人都要設定這麼多選項,實在是太麻煩了,所以我建議是透過 .editorconfig 來統一專案的程式碼風格,這樣就不用每個人分別設定了。

  1. 先加入 Visual Studio 2022 內建的 .editorconfig 設定檔,你可以參考下圖來新增

    image

  2. 直接在專案中加入我已經設定好的 .editorconfig 設定檔內容片段:

    以下片段直接加入到 .editorconfig 的最後一行下方即可,主要設定 *.cs 一定要以 UTF-8 with BOM 來儲存檔案,其餘就是統一 privateinternal 的欄位要以 _ (底線) 開頭,統一變數命名規則!

    [*.cs]
    
    charset = utf-8-bom
    
    #### Naming styles ####
    
    # Symbol specifications
    
    dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
    dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
    dotnet_naming_symbols.private_or_internal_field.required_modifiers =
    
    # Naming rules
    
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.severity = suggestion
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.symbols = private_or_internal_field
    dotnet_naming_rule.private_or_internal_field_should_be_prefix__.style = prefix__
    
    # Naming styles
    
    dotnet_naming_style.prefix__.required_prefix = _
    dotnet_naming_style.prefix__.required_suffix =
    dotnet_naming_style.prefix__.word_separator =
    dotnet_naming_style.prefix__.capitalization = camel_case
    

相關連結

留言評論