Asp.Net Core 源码编译过程

起因

很长一段时间编译Asp.Net Core源码总是因为下载所来依赖的环境,无法下载导致最终无法编译的. 其实调试学习.Net Core源码和Asp.Net Core源码我知道的方式有3种.
  1. 在VS中,工具→调试 设置 源服务器支持等选项,具体可以参考:如何:调试 .NET Framework 源代码
  2. 通过dnSpy工具,也可以进入.Net Framework和.Net Core源码中,看内部实现.
  3. 下载源码,自己编译,这个有调试文件.

总结3种方式: 第一种从微软服务器下载调试符号(pdb文件),有时比较神经.第二种自己编译比较麻烦(是最好的),第三种最简单,有时候源码反编译还原的不是很好的.今天主要说第二种方式.总体来说很折腾.

1. 准备环境和工具(BuildFromSource.md)

  1. Win10,不能低于1803的版本,大于10G的磁盘空间
  2. VS 这个本地即时安装了,还是要执行脚本,看看还有需要的环境.
  3. Git,这个好像也有版本要求
  4. NodeJs,版本不能低于10.14.2(哪里用的呢?是SignalR有JavaScript和TypeScript及Webpack打包所以才需要NodeJs)
  5. JDK版本不能低于11(为什么会用到Java呢? 是SignalR有Java的版本)
  6. .Net Framework 3.5(为什么需要这个呢? 生成安装包需要)
Chrome这个不是必选的.不过一般都会安装VS的,还是要执行VS的脚本,确定VS环境一直:
#需要用管理员打印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的这个分支的,这里的编译还是这个版本.
这里选择3.1.6这个版本
git checkout xxxx(分支名)

4. 修改配置

主要修改global.json和NuGet.config这两个文件
先看global.json文件
{
  "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呢?

选择Asp.net Core 3.1

编译3.1.16需要3.1.102的sdk

如果不相信的话,可以在根目录执行:

.\restore.cmd

在执行restore.cmd脚本中,会在根目录中生成一个.dotnet目录.会创建一个dotnet-install.ps1脚本,通过该脚本会下载所需要的sdk的.看到有下载sdk之后,终止脚本执行.

编辑.dotnet目录下的dotnet-install.ps1文件,搜索DownloadLink 复制一行后,注释所在行,这里固定下载地址为:上图的中sdk的Binaries中的x64链接所打开后的链接:

替换下载sdk的地址为direct link中的链接

#$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中

将vswhere放入指定的位置中

就这样,直到restore.cmd执行不报错的时候,就可以执行build.cmd了,因为中间一直在restore和build,下面的错误忘了,在什么时候报的了?

一个Razor的测试项目因为编码问题造成无法编译成功:

Razor的测试项目,因为字符编码无法编译成功

一个在src/Framework/App.Runtime下Microsoft.AspNetCore.App.Runtime.csproj文件,修改DotNetRuntimeDownloadUrl内容,图3右侧的x64链接打开后的direct link的地址:

Razor的测试项目,因为字符编码无法编译成功



秋风 2020-09-06