背景

当我们对ASP.Net Core内部的某些方法、类的实现感兴趣时,有很多方法可以去了解,看书,看各种文章,但是最直接也是最深入的办法就是去阅读源代码。
ASP.NET Core的源代码托管在Github,项目地址是:https://github.com/dotnet/aspnetcore
如果只是简单的想看某个方法是如何实现的,我们可以直接在github网站上浏览。
但是通过网页阅读源代码会遇到一些问题,首先是找到指定的类或方法并不容易,其次代码的展示效果并不友好。
因此最佳的方式就是下载源代码到我们本机。

下载源代码

在GitHub上托管的项目的源代码提供了几种下载方式:

使用git、SVN、GitHub的客户端,或者直接下载GitHub打包好的源代码压缩包。
如果是简单的项目,你可以直接下载GitHub打包好的源代码压缩包。

但是对于ASP.NET Core这种大型项目,下载的源代码压缩包由于缺少子模块的代码,无法通过编译。
不能通过编译的代码,下面这些功能无法使用:IDE提供的类和方法间的快速导航(F12),针对某个属性、方法等查找它被哪些代码所引用。
对于大型项目来说,缺少这些功能几乎没办法深入阅读该项目的源代码。
尤其是ASP.NET Core这种大量使用了扩展方法的项目,扩展方法可能定义在一个不起眼的角落,通过手工查找繁琐且困难。
所以强烈推荐使用git来克隆ASP.NET Core项目的仓库:

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

编译的准备工作

现在,我们已经有源代码了,但是由于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命令列出所有的版本。

git tag

然后根据标签名称,切换到我们的目标版本,比如3.1.0版本。

git checkout v3.1.0

在你使用Visual Studio或VS Code浏览代码之前需要运行.\restore.cmd(Windows环境,Linux和macOS请使用对应的.sh文件,下同)来还原编译所依赖的运行环境和各种组件。
每次源代码有大的更新时,你都需要重新运行.\restore.cmd。
运行.\restore.cmd后,脚本会立即开始检查编译所依赖的运行环境并下载各种组件(第一次运行时),
由于服务器都在国外,因此有些组件下载速度很慢。(如果某个组件下载速度很慢,kexue上网会有极大的改善)

首先会下载dotnet运行环境,这个是最大也是最慢的,做好心理准备。
它被存放在根目录的.dotnet目录下,差不多有1GB。

接下来开始下载各个项目所依赖的组件,这部分是通过nuget工具来下载的,
因为网络的原因,下载常常会出错,在我的中国电信宽带下反复重试依然如此。
因为nuget会在本地缓存曾经下载过的组件,所以一旦发生上面的情况,你可以通过下面这种方式解决:
在VS中新建一个ASP.NET Core的项目,然后在管理NuGet包界面来下载这个包(这时候就能下载了,问号脸),
之后因为本地有缓存了,再次通过命令行下载的时候就无需网络了。

在我本机编译的过程中,遇到了找不到某个包的情况:Microsoft.Internal.AspNetCore.H2Spec.All 2.1.1。
手工在nuget.org上搜索居然没有。后来在myget上找到了,还是先在Visual Studio的Package Manager Console中使用下面的这个命令先安装在上面新建的项目中:

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

再次运行命令就能找到包了。
运行图:


打开解决方案

由于ASP.NET Core项目实在太大了——包含单元测试在内有626个csproj文件,8207个cs文件——所以并没有一个包含所有子项目的解决方案(.sln文件)。
在.\src目录下面有很多子目录,每一个子目录都是一个子项目,每个子项目中都包含了一个解决方案(.sln文件)。
和我们平常打开自己的项目不一样,ASP.NET Core的解决方案文件(.sln)由于需要设置环境变量因此需要使用脚本命令来打开。
运行子目录中的startvs.cmd即可启动Visual Studio打开相应的子项目。

根据电脑配置,第一次启动可能需要耗费相当长的时间,下次就快了。
下图是MVC项目的解决方案,巨大无比吧。

现在,让我们开始好好享受阅读的乐趣吧。(手动狗头)

如果你需要编译源代码的话,修改源代码以后运行.\build.cmd文件,然后你可以去泡茶了,回来应该就差不多了。(再次狗头)

如何开始阅读ASP.NET Core源代码的更多相关文章

  1. 调试 ASP.NET Core 2.0 源代码

    在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行 ...

  2. ASP.NET Core 2.0 源代码

    ASP.NET Core 2.0 源代码 在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何 ...

  3. Debugging into .NET Core源代码的两种方式

    一.前言 .NET开源时间还不长,因为一直在做YOYOFx的关系,所似我常常有更深入的了解.NET Core和ASP.NET Core内容的需求,并且.NET Core平台与之前版本的变化太大,这也导 ...

  4. 剖析ASP.NET Core(Part 2)- AddMvc(译)

    原文:https://www.stevejgordon.co.uk/asp-net-core-mvc-anatomy-addmvccore发布于:2017年3月环境:ASP.NET Core 1.1 ...

  5. [转]Debugging into .NET Core源代码的两种方式

    本文转自:http://www.cnblogs.com/maxzhang1985/p/6015719.html 阅读目录 一.前言 二.符号服务器 三.项目中添加ASP.NET Core源代码 四.写 ...

  6. NET Core源代码通过Autofac实现依赖注入

    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性   阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...

  7. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  8. ASP.NET Core应用程序的参数配置及使用(转载)

    本文结构 提前准备 参数配置方式 appsettings.json 环境变量 命令行参数 在控制器中使用配置参数 注入IConfiguration对象 注入IOptions对象 总结 应用程序的开发不 ...

  9. 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性

    一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...

随机推荐

  1. java byte/short/char补充(了解)

    1.在数学运算中会自动提升数据类型为 int 2.在基本赋值中,若右册的常量不超过取值范围,javac 添加 强制转换,否则报错 3.若右册 含有 变量 而不是直接使用常量相加,编译报错 例子 pub ...

  2. Django redis 应用

    一.自定义连接池 与python中使用连接池一样(使用单例对象) 注意:每个视图函数都要有 conn = redis.Redis(connection_pool=POOL) 二.使用第三方模块(dja ...

  3. python接口测试,mock模块基本使用介绍

    mock简介 py3已将mock集成到unittest库中 为的就是更好的进行单元测试 简单理解,模拟接口返回参数 通俗易懂,直接修改接口返回参数的值 mock作用 解决依赖问题,达到解耦作用 当我们 ...

  4. java小心机(3)| 浅析finalize()

    每天进步一丢丢,连接梦与想 如果你停止就是谷底,如果你还在努力就是上坡 系列文章 java"小心机"(1)[资源彩蛋!] java小心机(2)| 重载和构造器的小细节 预备知识 J ...

  5. selenium,滚到页面底部的方法

    你可以用 execute_script方法来处理这个. 调用原生javascript的API,这样你想滚到哪里就能滚到哪里.   下面的代码演示了如何滚到页面的最下面:   driver.execut ...

  6. Centos搭建PXE,安装部署操作系统

    centos系统搭建PXE网络安装centos+ubuntu+Windows Centos搭建PXE,安装部署操作系统 一 . 原理: 1.什么是PXE: PXE(Pre-boot Execution ...

  7. 大事务造成的延迟(从binlog入手分析)

    log_event.cc 入口: int Query_log_event::do_apply_event(Relay_log_info const *rli,const char *query_arg ...

  8. Day4-Python3基础-装饰器、迭代器

    今日内容: 1.高阶函数 2.嵌套函数 3.装饰器 4.生成器 5.迭代器 1.高阶函数 定义: a:把一个函数名当作实参传给函数 a:返回值包含函数名(不修改函数的调用方式) import time ...

  9. java单例五种实现模式梳理

    java单例五种实现模式 饿汉式(线程安全,调用效率高,但是不能延时加载) 一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式.但是问题也比较明显.单例在 ...

  10. linux之nfs

    之前一篇博客记录了Windows系统与Linux系统文件共享的最佳选择,此篇记录Linux系统与Linux系统之间文件共享的最佳选择----NFS 一.NFS 简介和架构图 NFS是Network F ...