Asp.Net Core 源码编译过程
起因
很长一段时间编译Asp.Net Core源码总是因为下载所来依赖的环境,无法下载导致最终无法编译的. 其实调试学习.Net Core源码和Asp.Net Core源码我知道的方式有3种.- 在VS中,工具→调试 设置 源服务器支持等选项,具体可以参考:如何:调试 .NET Framework 源代码
- 通过dnSpy工具,也可以进入.Net Framework和.Net Core源码中,看内部实现.
- 下载源码,自己编译,这个有调试文件.
1. 准备环境和工具(BuildFromSource.md)
- Win10,不能低于1803的版本,大于10G的磁盘空间
- VS 这个本地即时安装了,还是要执行脚本,看看还有需要的环境.
- Git,这个好像也有版本要求
- NodeJs,版本不能低于10.14.2(哪里用的呢?是SignalR有JavaScript和TypeScript及Webpack打包所以才需要NodeJs)
- JDK版本不能低于11(为什么会用到Java呢? 是SignalR有Java的版本)
- .Net Framework 3.5(为什么需要这个呢? 生成安装包需要)
#需要用管理员打印Powershell, -Edition 指安装版本 Community(社区版) Professional(专业版) Enterprise(企业版), 我自己使用社区版
.\eng\scripts\InstallVisualStudio.ps1 -Edition=Community
2. 下载源码
从github.com或者gitee.com下载Asp.Net Core的源码. github地址: https://github.com/dotnet/aspnetcore#地址觉得慢的话,可以使用gitee
git clone --recursive https://github.com/aspnet/AspNetCore
下载完成之后,在源码根目录内,找到.git目录并进入,打开config文件进行修改Asp.Net Core子模块MessagePack-CSharp和googletest的地址,觉得慢的话可以区gitee查找.
MessagePack-CSharp地址(没测试,我本地使用github下载很慢):https://gitee.com/mirrors/MessagePack-CSharp.git
googletest地址:https://gitee.com/jianyun/googletest.git
修改之后,按照BuildFromSource.md文档,获取子模块
git submodule update --init --recursive
3. 选择编译版本
因为前一段时间,看源码一直用的3.1.6的这个分支的,这里的编译还是这个版本.git checkout xxxx(分支名)
4. 修改配置
{
"sdk": {
"version": "3.1.302" //编译所依赖的sdk版本,先确定编译哪个版本,然后去https://dotnet.microsoft.com/download/dotnet-core
},
"tools": {
"vswhere":"2.7.1", //新增,默认依赖的版本低,且无法下载,这个在vs的安装目录可以找到
"dotnet": "3.1.302", //和sdk版本一致
"runtimes": {
"dotnet/x64": [
"$(MicrosoftNETCoreAppInternalPackageVersion)" //记住该变量
],
"dotnet/x86": [
"$(MicrosoftNETCoreAppInternalPackageVersion)"
]
},
"Git": "2.22.0", //git所依赖的版本
"jdk": "11.0.3", //依赖jdk版本
"vs": {
"version": "16.0", //vs最低支持版本
"components": [
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
]
}
},
"msbuild-sdks": {
"Yarn.MSBuild": "1.15.2",
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.20213.4",
"Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.20213.4"
}
}
打开./eng/Versions.props,查找MicrosoftNETCoreAppInternalPackageVersion,将内容改为要编译的版本
为什么上边指定的sdk版本是3.1.102呢?
如果不相信的话,可以在根目录执行:
.\restore.cmd
在执行restore.cmd脚本中,会在根目录中生成一个.dotnet目录.会创建一个dotnet-install.ps1脚本,通过该脚本会下载所需要的sdk的.看到有下载sdk之后,终止脚本执行.
编辑.dotnet目录下的dotnet-install.ps1文件,搜索DownloadLink 复制一行后,注释所在行,这里固定下载地址为:上图的中sdk的Binaries中的x64链接所打开后的链接:
#$DownloadLink = Get-Download-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
$DownloadLink = "https://download.visualstudio.microsoft.com/download/pr/dafb4b49-9990-49aa-b8fe-9002c1a3578a/42acda06cb3d22d886b91aac37fda667/dotnet-sdk-3.1.302-win-x64.zip"
修改后,重新执行dotnet-install.ps1脚本,很快就可以将sdk下载结束.这时候会在.dotnet目录中生成一个x86的目录.该目录中也有一个dotnet-install.ps1的脚本文件.该文件会下载另外一个Asp.Net Core Runtime,这个在所需的sdk图中也有标注.在图中右侧是Asp.Net Core Runtime 地址(打开链接后),按上方修改dotnet-install.ps1脚本的套路:
#$DownloadLink = Get-Download-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
$DownloadLink = "https://download.visualstudio.microsoft.com/download/pr/402055ae-4406-46c4-be5e-19d67daf6f15/ab82f9b8e11093d082c23150a94bd8cf/aspnetcore-runtime-3.1.6-win-x86.zip"
当有提示下载vswhere的时候,去VS安装的目录中,在Installer目录中,拷贝vswhere文件,将该文件放入源码根目录中的.tools中
就这样,直到restore.cmd执行不报错的时候,就可以执行build.cmd了,因为中间一直在restore和build,下面的错误忘了,在什么时候报的了?
一个Razor的测试项目因为编码问题造成无法编译成功:
一个在src/Framework/App.Runtime下Microsoft.AspNetCore.App.Runtime.csproj文件,修改DotNetRuntimeDownloadUrl内容,图3右侧的x64链接打开后的direct link的地址: