The Will Will Web

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

如何正確建置 ASP.NET MVC 5 原始碼並對原始碼進行分析研究

上次寫這個主題已經是 2009/2/8 的事情了,原來我已經用 ASP.NET MVC 寫了超過 12 年。時至今日 ASP.NET MVC 5 已經非常穩定,而且微軟還有團隊在維護這套框架,但不會增加新功能,只會修正社群回報的 Bug 而已。由於最近正在進行 ASP.NET MVC 5 開發實戰課程,我也非常建議學員可以下載原始碼回來研究,所以這篇文章我將說明下載原始碼編譯的幾個重要步驟。

準備能夠成功建置 ASP.NET MVC 5 原始碼的基本環境

  1. 下載 .NET Core 2.1 SDK

    目前最新版的 .NET Core 2.1 SDK 有分兩個版本,分別是支援 Visual Studio 2017 的 v2.1.524 版本,以及支援 Visual Studio 2019 的 v2.1.816 版本。

    🔥 請務必安裝支援 Visual Studio 2017.NET Core 2.1 SDK 版本!

    以下是快速自動安裝的 PowerShell 命令:

    Invoke-WebRequest https://download.visualstudio.microsoft.com/download/pr/c72a8b51-d3ef-4900-b950-55c9707c63d3/76948b5f23d012affb30f2cc24d3131e/dotnet-sdk-2.1.524-win-x64.exe -outfile $env:temp\dotnet-sdk-2.1.524-win-x64.exe
    Start-Process $env:temp\dotnet-sdk-2.1.524-win-x64.exe -ArgumentList '/quiet' -Wait
    
  2. 安裝 Visual Studio 2017 建置工具

    安裝 Visual Studio 2017 Build Tools.NET Core build tools workload for Visual Studio 2017 Build Tools 這兩個 Chocolatey 套件即可。

    choco install visualstudio2017buildtools visualstudio2017-workload-netcorebuildtools -y
    

下載原始碼並編譯專案

目前最新版 ASP.NET MVC 原始碼都放在 aspnet/AspNetWebStack 這個 GitHub Repo 下,但事實上這個是一個蠻大的專案,其原始碼涵蓋了 ASP.NET MVC 5.x, Web API 2.x, 與 Web Pages 3.x 等框架,其中還包含了許多範例程式單元測試程式碼,非常具有參考價值,也是個非常棒的學習資源!

  1. 下載最新版 ASP.NET MVC 原始碼 (僅下載 v3.2.7 版本的原始碼)

    git clone https://github.com/aspnet/AspNetWebStack.git -b v3.2.7 --depth=1
    cd AspNetWebStack
    

    注意:使用 --depth=1 只會下載指定分支/標籤下最新一個版本的 Git 物件,下載速度極快,但看不到其他歷史版本!

  2. 檢查原始碼中的 global.json 檔案中的 .NET Core SDK 版本

    請手動修改該檔案的 version 屬性,改成你剛剛安裝的 .NET Core 2.1 SDK 版本 (Visual Studio 2017)

    {
        "sdk": {
            "version": "2.1.524"
        }
    }
    
  3. 建置專案

    由於 GitHub Repo 上面並沒有說明如何建置該專案,基本上建議你用以下命令建置,成功率將會大增!

    build.cmd Build /p:BuildPortable=false
    
  4. 執行所有的 xUnit 單元測試程式

    先執行 EnableSkipStrongNames 目標,否則你將無法成功執行 xUnit 測試程式

    build.cmd EnableSkipStrongNames
    

    直接執行 build.cmd 命令即可開始跑所有測試

    build.cmd
    

    我有發現 GenerateTokenHtmlEncodesValues() 測試方法在我的電腦無法成功通過單元測試,不太確定是什麼問題。我有開一個 Issue #301 追蹤這個問題。如果要通過這個測試,可以暫時手動跳過這個測試,只要在 [Fact] 改成 [Fact(Skip = "Might be a bug")] 即可。

使用 Visual Studio 2019 分析 ASP.NET MVC 5 原始碼的技巧

如果你想直接以 Visual Studio 2019 開啟專案,請開啟 Runtime.sln 方案檔進行建置。

開啟方案總管即可看到所有 ASP.NET Web Stack 的所有原始碼:

Runtime

以下我分享幾個查找原始碼的技巧:

  1. 善用 Ctrl+, 快速查找檔案

    快速查找檔案

  2. 善用 與使用中文件同步處理 功能快速開啟檔案在方案總管中的位置

    Sync with Active Document

  3. 善用方案總管去尋找一個抽象類別衍生類型(Derived Types)/實作者(Implements) (超級實用!)

    善用方案總管去尋找一個抽象類別的衍生類型

    方案總管 / 衍生類型

  4. 尋找 ASP.NET MVC 應用程式的啟動點:MvcHandler

    ASP.NET MVC 5 框架其實是一個 IHttpHandler 的實作,所以你要找到一個名為 MvcHandler 的類別,裡面有個 IHttpHandler.ProcessRequest(HttpContext httpContext) 方法,就是整個 ASP.NET MVC 5 的啟始點,從這裡開始看程式,你將會發現許多鮮為人知的寶貝與程式寫法! 👍

相關連結

留言評論