1. 程式人生 > >如何開始閱讀ASP.NET Core原始碼

如何開始閱讀ASP.NET Core原始碼

背景

當我們對ASP.Net Core內部的某些方法、類的實現感興趣時,有很多方法可以去了解,看書,看各種文章,但是最直接也是最深入的辦法就是去閱讀原始碼。
ASP.NET Core的原始碼託管在Github,專案地址是:https://github.com/dotnet/aspnetcore。
如果只是簡單的想看某個方法是如何實現的,我們可以直接在github網站上瀏覽。
但是通過網頁閱讀原始碼會遇到一些問題,首先是找到指定的類或方法並不容易,其次程式碼的展示效果並不友好。
因此最佳的方式就是下載原始碼到我們本機。

下載原始碼

在GitHub上託管的專案的原始碼提供了幾種下載方式:

使用git、SVN、GitHub的客戶端,或者直接下載GitHub打包好的原始碼壓縮包。

如果是簡單的專案,你可以直接下載GitHub打包好的原始碼壓縮包。

但是對於ASP.NET Core這種大型專案,下載的原始碼壓縮包由於缺少子模組的程式碼,無法通過編譯。
不能通過編譯的程式碼,下面這些功能無法使用:IDE提供的類和方法間的快速導航(F12),針對某個屬性、方法等查詢它被哪些程式碼所引用。
對於大型專案來說,缺少這些功能幾乎沒辦法深入閱讀該專案的原始碼。
尤其是ASP.NET Core這種大量使用了擴充套件方法的專案,擴充套件方法可能定義在一個不起眼的角落,通過手工查詢繁瑣且困難。
所以強烈推薦使用git來克隆ASP.NET Core專案的倉庫:

git clone --recursive https://github.com/dotnet/aspnetcore


編譯的準備工作

現在,我們已經有原始碼了,但是由於ASP.NET Core專案使用了很多其他技術,所以編譯原始碼之前需要準備編譯環境。
不同的作業系統需求不一樣,以Windows環境下使用Visual Stuido舉例,當前官方文件(3.1.1版本)上面列出的需求是:

  • Windows 10 version 1803 或更新版本
  • Visual Studio 2019
    版本雖然沒有要求,但是實際依賴的部分元件會在更新版本的更新中包含。
    例如,如果你編譯3.1.0版本的程式碼,需要更新到16.4.4以上版本(包含新版本的MSBuild)。
    如果使用VS Code,請看後面的介紹。
  • Git https://git-scm.org
  • NodeJS 10.14.2或更新版本 https://nodejs.org
  • Java Development Kit 11 或更新版本
  • Chrome 基於Selenium的測試要用到

如果你使用的是其它環境(Linux或macOS, VS Code等),請檢視詳細的安裝文件(原始碼中的docs/BuildFromSource.md檔案),按照其中Install pre-requisites部分的指引準備編譯環境。
更細節的內容,比如編譯時怎麼查詢JDK的(如果你本機已經安裝過了,但是指令碼提示找不到),你可以直接檢視編譯指令碼,.\build.ps1(或.\build.sh)檔案。

還原

當編譯環境準備好以後,記得開啟新的命令列視窗,因為新增的環境變數只在安裝後啟動的命令列中生效。
前面克隆到本機的是最新的程式碼(更新頻繁),但是對於大多數人來說,我們只關注自己目前正在使用的版本。
ASP.NET Core所有版本的釋出都打了標籤(tag)。
因此,我們可以先使用git命令列出所有的版本。

git tag

然後根據標籤名稱,切換到我們的目標版本,比如3.1.0版本。

git checkout v3.1.0

在你使用Visual Studio或VS Code瀏覽程式碼之前需要執行.\restore.cmd(Windows環境,Linux和macOS請使用對應的.sh檔案,下同)來還原編譯所依賴的執行環境和各種元件。
每次原始碼有大的更新時,你都需要重新執行.\restore.cmd。
執行.\restore.cmd後,指令碼會立即開始檢查編譯所依賴的執行環境並下載各種元件(第一次執行時),
由於伺服器都在國外,因此有些元件下載速度很慢。(如果某個元件下載速度很慢,kexue上網會有極大的改善)

首先會下載dotnet執行環境,這個是最大也是最慢的,做好心理準備。
它被存放在根目錄的.dotnet目錄下,差不多有1GB。

接下來開始下載各個專案所依賴的元件,這部分是通過nuget工具來下載的,
因為網路的原因,下載常常會出錯,在我的中國電信寬頻下反覆重試依然如此。
因為nuget會在本地快取曾經下載過的元件,所以一旦發生上面的情況,你可以通過下面這種方式解決:
在VS中新建一個ASP.NET Core的專案,然後在管理NuGet包介面來下載這個包(這時候就能下載了,問號臉),
之後因為本地有快取了,再次通過命令列下載的時候就無需網路了。

在我本機編譯的過程中,遇到了找不到某個包的情況:Microsoft.Internal.AspNetCore.H2Spec.All 2.1.1。
手工在nuget.org上搜索居然沒有。後來在myget上找到了,還是先在Visual Studio的Package Manager Console中使用下面的這個命令先安裝在上面新建的專案中:

PM> Install-Package Microsoft.Internal.AspNetCore.H2Spec.All -Version 2.1.1 -Source https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json

再次執行命令就能找到包了。
執行圖:
 


開啟解決方案

由於ASP.NET Core專案實在太大了——包含單元測試在內有626個csproj檔案,8207個cs檔案——所以並沒有一個包含所有子專案的解決方案(.sln檔案)。
在.\src目錄下面有很多子目錄,每一個子目錄都是一個子專案,每個子專案中都包含了一個解決方案(.sln檔案)。
和我們平常開啟自己的專案不一樣,ASP.NET Core的解決方案檔案(.sln)由於需要設定環境變數因此需要使用指令碼命令來開啟。
執行子目錄中的startvs.cmd即可啟動Visual Studio開啟相應的子專案。

根據電腦配置,第一次啟動可能需要耗費相當長的時間,下次就快了。
下圖是MVC專案的解決方案,巨大無比吧。

現在,讓我們開始好好享受閱讀的樂趣吧。(手動狗頭)

如果你需要編譯原始碼的話,修改原始碼以後執行.\build.cmd檔案,然後你可以去泡茶了,回來應該就差不多了。(再次狗