Appearance
AspNetCore 源码编译
1. 物料准备
2. 恢复源码
2.1. 下载源码
复制仓库地址
https://github.com/dotnet/aspnetcore.git并将其导入 Gitee(预计等待时间 5 分钟左右)在等待期间先配置下 git 支持长文件名
git config --global core.longpaths true(否则后面克隆的时候会报错)从 Gitee 上将项目源码克隆到本地
因为包含子模块,而子模块默认还是从 github 上面下载的,会比较慢,等待时间大概 10~15 分钟左右。
Note:修改子模块下载地址
要是不愿意等的话可以修改子模块下载地址:
首先
Ctrl+C终止当前子模块的下载打开
.git\config文件,把github.com相关的仓库地址改成国内加速站点的地址(或者导入 gitee 后再从 gitee 下载也可以),并保存文件进入到
src\submodules目录,把下面相关的子模块文件删除掉
回到 git bash
- 执行
cd aspnetcore,进入到aspnetcore目录下 - 再执行命令
git submodule update --init --recursive
- 执行
把刚才
config文件的地址改回来
注意仓库路径不要包含空格否者后面恢复源码的时候会出问题
PowerShellgit clone --recursive git@gitee.com:yourname/aspnetcore.git
检出你想要编译的 aspnetcore 版本,如:
v6.0.5
2.2. 配置环境
打开官方编译指南,先把文档切换切换至 git 相同的版本,如:
v6.0.5
查看编译代码所需的前提条件,以及安装所需的 Visual Studio 版本及相关的模块
以下命令默认是安装的 Enterprise 版,如果需要修改版本则可以指定
-Edition参数PowerShell./eng/scripts/InstallVisualStudio.ps1
相关所需的模块它已经自动帮你勾号了,确认安装的 VS 没问题后直接点击安装就行了

在等待安装 Visual Studio 的时候可以先接着安装其它相关所需的内容(建议安装要求的最低版本就可以了,否则后续在编译的时候可能会出现一切奇怪的问题)
Git
nodejs:

查看已安装 node.js 的版本:
node -vYarn:

JDK

查看已安装的 Java 版本:
java -version配置
JAVA_HOME环境变量
2.3. 修改配置
经过各种被虐,实践证明,只需要改 global.json 文件,添加 vswhere 节点的配置即可(版本号与你当前电脑上的 vswhere 版本号相同即可):

Note:这是一个坑
打开 .net SDK 下载地址,查看 SDK 版本
修改
global.json文件配置复制
global.json文件中的MicrosoftNETCoreBrowserDebugHostTransportVersion这段代码,打开eng\Versions.props文件,Ctrl+F,Ctrl+V找到节点:打开
NuGet.config文件,搜索 “int” 这个关键字,把value里面包含 “int” 相关的选项给它注释掉(如果有的话,目前我这个文件没有就不用管了),因为这些都访问不了
2.4. 恢复源码
打开
.dotnet\dotnet-install.ps1文件,搜索 “Downloading” 关键字,找到大概类似如下代码:
执行
.\restore.cmd,把控制台中类似下面的输出内容复制出来:Text... Downloading ... https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.300/dotnet-sdk-6.0.300-win-x64.zip ...1
2
3这里下载非常慢,先把它关掉。咱们需要找到对应版本的 SDK 以及运行时压缩包,并把它们的下载地址替换掉,这里以
https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.300/dotnet-sdk-6.0.300-win-x64.zip为例:打开 .net SDK 下载地址,找到
dotnet-sdk-6.0.300-win-x64.zip对应的版本:
复制下载地址:

回到
.dotnet\dotnet-install.ps1文件,添加以下这段代码:PowerShellIf ($link.downloadLink -eq "https://dotnetcli.azureedge.net/dotnet/Sdk/6.0.300/dotnet-sdk-6.0.300-win-x64.zip") { $link.downloadLink = "https://download.visualstudio.microsoft.com/download/pr/cc89c1f6-0d56-46fd-88f9-1fbd8ce074ec/753afbad1926cbc8d28aa4a2dd7d9d66/dotnet-sdk-6.0.300-win-x64.zip" }1
2
3
执行过程中会多次下载 Sdk 或 Runtime,重复按上面进行操作就行
再次执行
.\restore.cmd,等差不多它执行一会儿之后差不多又会卡在这个位置:
这时我们来到
.dotnet目录下面,发现这里多了一个x86文件夹,打开进去又有一个dotnet-install.ps1,换汤不换药我们如法炮制再来一次,再逐一替换下载地址:需要注意的是,需要把:
- x64 相关的下载地址替换到
.dotnet\dotnet-install.ps1文件里面 - x86 相关的下载地址替换到
.dotnet\x86\dotnet-install.ps1文件里面

- x64 相关的下载地址替换到
等 Sdk、Runtime 都下载安装完成之后,它会开始下载
vswhere,当然一如既往的优秀,它肯定下载不下来
此时我们会发现多了一个
.tools文件夹,进去下面有一个vswhere文件夹,再进去下面还有一个以版本号格式进行命名的文件夹(版本号就是咱们刚才在global.json里面配置的vswhere版本号),咱们把本地的vswhere.exe复制进去(如果已经有了那么就直接替换掉)
再次重新执行
.\restore.cmd,如果卡住的话就多重复执行几次,顺利的话就恢复成功了
3. 编译源码
切换到对应的项目文件夹下面(如:
.\src\Mvc)点击startvs.cmd打开项目
把
MvcSandbox设置为启动项目:
调试选项是不能选择 IIS 的,把它切换成
MvcSandBox
喝口水上个洗手间,仪式感搞起来,搓搓手,
F5!emmm……不出意外的话应该报错了,没事,这时候应该都是一些小问题,调整下代码就行了,比如我目前只改了这个文件:.\src\Hosting\Hosting\src\Internal\WebHost.cs
运行成功

4. 打包 SDK
参考官方的教程逐一执行以下命令:
PowerShell.\build.cmd -all -pack -arch x64PowerShell.\build.cmd -all -pack -arch x86 -noBuildJavaPowerShell.\build.cmd -buildInstallers在执行的过程中可能会遇到类似
Attempting download '...' to '...'的输出提示。等它自己下载是不可能的,咱们需要自己去 .net SDK 下载地址 上下载对应的内容,并将其放置到对应的目录即可。这个步骤差不多需要重复执行几次,过程中可能需要重启电脑(Ctrl+C取消执行后,貌似有子进程没有关闭,具体原因没有细究先简单重启解决)
或者直接打开
.\eng\tools\RepoTasks\DownloadFile.cs,找到Log.LogMessage(MessageImportance.High, $"Attempting download '{source}' to '{target}'");在上方添加:csharpif (source == @"https://dotnetcli.azureedge.net/dotnet/Runtime/6.0.5-servicing.22213.9/dotnet-runtime-6.0.5-win-x64.zip") { source = @"https://download.visualstudio.microsoft.com/download/pr/50c64d87-3ca7-451b-9bf9-7cbc8578d1a7/18577a0122d43a650f31188a097878f5/dotnet-runtime-6.0.5-win-x64.zip"; } else if (source == @"https://dotnetcli.azureedge.net/dotnet/Runtime/6.0.5-servicing.22213.9/dotnet-runtime-6.0.5-win-x86.zip") { source = @"https://download.visualstudio.microsoft.com/download/pr/54fcf294-d31d-4e1d-a365-ff16aef1c33e/da869b444d32f364ce2b81a5a6176510/dotnet-runtime-6.0.5-win-x86.zip"; } else if (source == @"https://dotnetcli.azureedge.net/dotnet/Runtime/6.0.5-servicing.22213.9/dotnet-runtime-6.0.5-win-x64.exe") { source = @"https://download.visualstudio.microsoft.com/download/pr/b395fa18-c53b-4f7f-bf91-6b2d3c43fedb/d83a318111da9e15f5ecebfd2d190e89/dotnet-runtime-6.0.5-win-x64.exe"; } else if (source == @"https://dotnetcli.azureedge.net/dotnet/Runtime/6.0.5-servicing.22213.9/dotnet-runtime-6.0.5-win-x86.exe") { source = @"https://download.visualstudio.microsoft.com/download/pr/205afc96-c1cf-499e-a02b-5222f0806f9b/c97f9ee3ce58cae4ffe746732fa99784/dotnet-runtime-6.0.5-win-x86.exe"; }1
2
3
4
5
6
7
8
9
执行
.\build.cmd -buildInstallers的时候可能会遇到类似如下的提示:TextC:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(456,5): error MSB8052: MSVC 工具集版本“v143”与“v142”平台工具集不兼容。请将平台工具集更改为 vv13,或将 MSVC 工具集版本(VCToolsVersion 属性)设置为采用格式 "14.2*.*" 的版本。若要对给定平台工具集使用默认 MSVC 工具集版本,请不要设置 VCToolsVersion 属性。[C:\Users\Cocoa\Documents\Workspace\aspnetcore\src\Installers\Windows\AspNetCoreModule-Setup\CustomAction\aspnetcoreCA.vcxproj] C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(456,5): error MSB8052: MSVC 工具集版本“v143”与“v142”平台工具集不兼容。请将平台工具集更改为 vv13,或将 MSVC 工具集版本(VCToolsVersion 属性)设置为采用格式 "14.2*.*" 的版本。若要对给定平台工具集使用默认 MSVC 工具集版本,请不要设置 VCToolsVersion 属性。[C:\Users\Cocoa\Documents\Workspace\aspnetcore\src\Installers\Windows\AspNetCoreModule-Setup\CustomAction\aspnetcoreCA.vcxproj]1
2直接打开提示中的
aspnetcoreCA.vcxproj文件,找到PlatformToolset节点,将v142改成v143即可:
如果目标版本是
v6.0.5而且只有装 VS 2022 没有装 VS 2019,那么很可能出现如下提示:TextC:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: 找不到 Windows SDK 版本 10.0.17134.0。请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单 击解决方案并选择“重定解决方案目标”来更改 SDK 版本。 [D:\01_Computer\10_Projects\VisualStudio\aspnetcore\src\Installers\Windows\AspNetCoreModule-Setup\CustomAction\aspnetcoreCA.vcxproj] C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: 找不到 Windows SDK 版本 10.0.17134.0。请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单 击解决方案并选择“重定解决方案目标”来更改 SDK 版本。 [D:\01_Computer\10_Projects\VisualStudio\aspnetcore\src\Installers\Windows\AspNetCoreModule-Setup\CustomAction\aspnetcoreCA.vcxproj]1
2
3
4这是因为 VS 2022 的组件中不包含
Windows SDK 版本 10.0.17134.0。目前网上好像没有直接提供Windows SDK 版本 10.0.17134.0的下载,解决办法就是安装 VS 2019 然后只勾上Windows SDK 版本 10.0.17134.0的组件。要是不想再安装一个 VS 2019,则也可以:定位到
.\src\Installers\Windows\AspNetCoreModule-Setup\目录找到并打开该目录及子目录下的所有
*.vcxproj文件定位到
<PropertyGroup Label="Globals">节点,在这个节点下面添加你电脑目前里面有安装的 Windows SDK 版本就行了,如:XML<PropertyGroup Label="Globals"> ... <WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion> </PropertyGroup>1
2
3
4再找到
PlatformToolset节点,将v142改成v143即可XML<PropertyGroup> ... <PlatformToolset>v143</PlatformToolset> ... </PropertyGroup>1
2
3
4
5


