背景

当我们对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. 7月17日刷题记录 分治Getting!循环比赛日程表

    通过数:1 ┭┮﹏┭┮ qdoj.xyz 1053 分治-循环比赛日程表 其实今天晚上留给编程的时间并不多,做出一道... 不过收获还是非常大的 毕竟本人从来没有学习过分治算法,今天竟然攻克了我人生中 ...

  2. Spring Framework 源码编译导入

    预先准备环境 Window 10 JDK环境 List item Gradle 以及其环境变量配置 spring-framework源码(https://gitee.com/mirrors/Sprin ...

  3. day6 相对定位:position:relative

    相对定位:position:relative 特点:a.相对于自己原来位置的定位,以自己的左上角为基准. b.相对定位原来的位置仍然算位置,不会出现浮动现象. 以下为初始位置:(可以看出设置margi ...

  4. Linux 编程题

    1. 产生一个进程树,父进程有2个子进程,这2个子进程分别又有2个子进程,每个进程休眠5秒后退出,并在退出前打印自己的进程id号. # include<stdio.h> # include ...

  5. java 语句流程

    一.if条件判断 太简单,不加说明 二.switch条件选择语句 注意: 1.switch(表达式),表达式的数据类型 byte/short/char/int/String/enum 2.别忘记写br ...

  6. pycharm 安装vue

    1.设置JS为ES6 2.安装vue.js 3.重启pycharm 4.检查

  7. Drupal SA-CORE-2019-010 .开头文件名(如.htaccess) 文件上传

    目录 drupal .开头文件名 文件上传 原生模块分析 第三方模块分析 补丁 参考 drupal .开头文件名 文件上传 通过diff 8.8.1的补丁,很容易发现修复点,位于core\module ...

  8. [bzoj3926] [loj2137] [Zjoi2015] 诸神眷顾的幻想乡

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...

  9. 团队项目-Beta冲刺(第一周)

    团队项目-Beta冲刺(第一周) 一. 作业描述 这个作业属于哪个课程 这个作业要求在哪里 团队名称 CTRL-IKun 这个作业的目标 合理安排时间完成接下来的任务,剩余任务预估,分配任务(开发,测 ...

  10. selenium等待方式之显示等待

    有时候,页面元素并未及时加载出来导致后面的步骤无法执行 这里就需要在加载前添加等待时间,让目标元素有足够的时间加载出来 第一种方法:使用time.sleep() 这种方法过于强制,无论元素是否加载出来 ...