如何开始阅读ASP.NET Core源代码
背景
当我们对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源代码的更多相关文章
- 调试 ASP.NET Core 2.0 源代码
在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行 ...
- ASP.NET Core 2.0 源代码
ASP.NET Core 2.0 源代码 在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何 ...
- Debugging into .NET Core源代码的两种方式
一.前言 .NET开源时间还不长,因为一直在做YOYOFx的关系,所似我常常有更深入的了解.NET Core和ASP.NET Core内容的需求,并且.NET Core平台与之前版本的变化太大,这也导 ...
- 剖析ASP.NET Core(Part 2)- AddMvc(译)
原文:https://www.stevejgordon.co.uk/asp-net-core-mvc-anatomy-addmvccore发布于:2017年3月环境:ASP.NET Core 1.1 ...
- [转]Debugging into .NET Core源代码的两种方式
本文转自:http://www.cnblogs.com/maxzhang1985/p/6015719.html 阅读目录 一.前言 二.符号服务器 三.项目中添加ASP.NET Core源代码 四.写 ...
- NET Core源代码通过Autofac实现依赖注入
查看.NET Core源代码通过Autofac实现依赖注入到Controller属性 阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...
- ASP.NET Core 3.0中使用动态控制器路由
原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...
- ASP.NET Core应用程序的参数配置及使用(转载)
本文结构 提前准备 参数配置方式 appsettings.json 环境变量 命令行参数 在控制器中使用配置参数 注入IConfiguration对象 注入IOptions对象 总结 应用程序的开发不 ...
- 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...
随机推荐
- 从操作系统层面理解Linux下的网络IO模型
I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据: ...
- springboot2 整合redis
1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- python字典的遍历
遍历字典: keys() .values() .items() 1. xxx.keys() : 返回字典的所有的key 返回一个序列,序列中保存有字典的所有的键 效果图: 代码: ...
- 78.纯 CSS 创作 Windows 启动界面
原文地址:https://segmentfault.com/a/1190000015632759 学习后效果地址:https://scrimba.com/c/cPgWmZCg HTML code: & ...
- ES6的Object.assign()基本用法
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). 例如: const target = {a:1}, const source1 ...
- 倍增ST应用 选择客栈(提高组)
重磅例题!ST表应用!提高组Getting! 1125: B15-倍增-习题:选择客栈[ST表应用] 时间限制: 1 Sec 内存限制: 128 MB提交: 35 解决: 12[提交] [状态] ...
- 三分钟带你入门GitHub
一,首先,我们来说一下什么是GitHub GitHub是一个基于git打造的开源社区 ,同时也是一个大型同性交友平台 ,作为一个专业的程序员,你非常有必要知道并使用GitHub:作为一个国际化社区,所 ...
- Cannot create PoolableConnectionFactory (Could not create connection to database server.)
是由于mysql驱动版本太低导致. 本人 jdk版本是1.8.0_211,mysql版本是8.0.17,mysql-connector-java版本是5.1.39, 后来把mysql-connecto ...
- 【大道至简】NetCore3.1快速开发框架一:搭建框架
这一章,我们直接创建NetCore3.1的项目 主要分为1个Api项目,和几个类库 解释: 项目——FytSoa.Api:提供前端接口的Api项目 类库——FytSoa.Core:包含了数据库操作类和 ...
- 若依框架. 仿ThymeLeaf前端SelectDictLable方法
在framework项目下新增所需服务