通過源碼學習,不但可以讓我們知道asp.net core框架更底層的原理,而且在遇到問題找不到資料時,也是一個解決道路,以下是我准備asp.net core源碼編譯時的步驟。
1.下載源碼:github https://github.com/dotnet/aspnetcore
$ git clone --recursive https://github.com/aspnet/AspNetCore
$ git submodule update --init --recursive
2.用希望調試的tag版本創建分支,如果只想調主分支可忽略此步,我要調試的是 v3.1.10,選擇版本的時候最好選擇你本機Asp.net core的最高版本,
查看所有tag
$ git tag
檢出v3.1.10
$ git checkout -b local3.1.10 v3.1.10
還原子模塊
$ git submodule update --init --recursive
3.准備環境
- windows 10,版本>=1803,打開powershell執行腳本的限制
以管理員運行powershell
PS> set-ExecutionPolicy RemoteSigned,選擇'Y'
- >10GB的磁盤剩余空間
- Visual Studio 2019,同時需要安裝C++桌面開發包和其它的一些必要的組件
PS> ./eng/scripts/InstallVisualStudio.ps1
- Git客戶端工具
- NodeJS >=10.14.2
- JDK >=11,可用安裝腳本安裝
PS> ./eng/scripts/InstallJdk.ps1
-
安裝Chrome, Selenium測試需要這個
4.Visual Stduio 中編譯
- 還原依賴,和各種語言、平台項目的包.
PS> .\restore.cmd
這個過程會比較慢,等的時間也是最長的,尤其Yarn的包管坑不管埋的慢,一直在失敗,程序會自動重試。
- 編譯
PS>.\build.cmd
經過漫長的等待,如果不出意外,就編譯成功了。程序生成在:artifacts/bin目錄下。
- 源碼中根據不同的組件包含多個解決方案,sln是不可以直接打開的,正確的方式是運行目錄 里的startvs.cmd 它會設置必要的環境變量,並自動使用Visual Studio打開.sln文件。
我們以MVC項目為例,打開/src/Mvc/startvs.cmd。
“生成”一下samples/MvcSandbox,並設為啟動項目,如果全部生成成功,就可以運行了。這里需要注意,運行的時候要以控制台模式運行Mvc,而不要選擇“IIS Express"模式。
成功運行如下:
5.打包及源碼步進調試
- 編譯源碼生成nuget包和運行時安裝包。
PS>./build.cmd -all -pack -arch x64
PS>./build.cmd -all -pack -arch x86 -noBuildJava
PS>./build.cmd -buildInstallers
編譯出來的運行時安裝包,裝上之后,在新建項目時,選擇對應的asp.net core 版本,在調試的時候就可以步進調試了。
6.編譯Extensions項目
-
在前面我們調試的時候會發現在有些函數是不能逐語句調試的,除去.net core的程序集外,還有一部分是位於Extensions項目的程序集,我們通過源碼編譯一下.
源碼下載
$ git clone https://github.com/dotnet/extensions
把指定標簽版本遷至分支
$ git checkout -b local3.1.10 v3.1.10
還原依賴
PS> ./restore.cmd
打開VS 編輯源碼
PS> ./startvs.cmd
-
Extensions項目不是安裝包,而是一系統的程序集,我們可以通過生成符號nuget包並在vs中引用這些包的方式來實現調試時步入源碼。
第一步.編譯生成
PS> ./build.cmd
編譯之后會在artifacts\packages\Debug\Shipping目錄生成nuget的符號包
第二步.在需要調試項目的解決方案目錄(.sln目錄)新建nuget.config文件,文件內容:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="MyBuildOfAspNetCore" value="D:\dotnet_opensource\extensions\artifacts\packages\Debug\Shipping" /> <add key="NuGet.org" value="https://api.nuget.org/v3/index.json" /> </packageSources> </configuration>
MyBuildOfAspNetCore的值為我們編譯出來的包含符號包的目錄。
當然也可以在VS中把我們的MyBuildOfAspNetCore設置成全部的nuget源,針對所有項目都生效。
第三步.項目中使用nuget引用將需要步入源碼的nuget包,調試時逐語句進入即可。
如果以前我們引用過相同版本的extensions nuget包,可能存在緩存的問題而加載不了我們自已編譯的extensions。我們可以清一下nuget的緩存。
打開Visual Studio ,Tools -> NuGet Package Manager -> Package Manager Colsole,輸入命令
PM> nuget locals all -clear
7.其它問題
*我在網上看到別人restore慢的解決方案是設置代理,如下:
需要為 Powershell 與命令行設置代理,根據自己代理軟件的監聽的端口進行調整:
# CMD
set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890
# Powershell
$Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890"
但我是開着梯子編的,不過我的梯子沒啥用。不知這個方法是否可行。
*如果遇到以下錯誤,需要自已下載相應版本的grandle,也可在編譯命令后加“ -noBuildJava”,來不編譯java部分。
grandle發行列表:https://services.gradle.org/distributions/
下載相應的文件再重新編譯即可,
我的是gradle-5.3-bin.zip至目錄 :C:\Users\[你的登陸用戶]\.gradle\wrapper\dists\gradle-5.3-bin\[隨機目錄]