如何開始閱讀ASP.NET Core源代碼

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

下載源代碼

在GitHub上託管的項目的源代碼提供了幾種下載方式:

如何開始閱讀ASP.NET Core源代碼

使用git、SVN、GitHub的客戶端,或者直接下載GitHub打包好的源代碼壓縮包。如果是簡單的項目,你可以直接下載GitHub打包好的源代碼壓縮包。

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

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

編譯的準備工作

現在,我們已經有源代碼了,但是由於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命令列出所有的版本。

<code>git tag/<code>

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

<code>git checkout v3.1.0/<code>

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

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

如何開始閱讀ASP.NET Core源代碼

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

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

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

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

如何開始閱讀ASP.NET Core源代碼

打開解決方案

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

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

如何開始閱讀ASP.NET Core源代碼

現在,讓我們開始好好享受閱讀的樂趣吧。


分享到:


相關文章: