如何开始阅读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 ...
随机推荐
- 浏览器从输入url 到页面展示完成响应过程
用户从输入 url 到浏览器响应,呈现给用户的具体过程 1.用户在输入栏输入地址 (1) 如果有 beforeunload 事件会先执行判断继续还是跳出操作 (2) 浏览器进程识别是 地址还是关键字检 ...
- C# 使用nuget.exe发布类库及更新类库
前景:在开发学习阶段希望一些重复使用代码或者算法代码积累.能够在VS中下载安装方便使用. 准备工作: 1.Nuget登录账号(可 Microsoft 账号).Nuget官网 2.Nuget.exe程序 ...
- Map2Shp7专业版新增功能
Map2Shp7专业版产品在上一版基础上,新增并优化了用户界面.转换对象.专业数据模型等相关功能.具体新增特性如下: 用户界面采用最新流行的Microsoft Office 2016 风格的界面(Ri ...
- 你还不会Git?那就不要写代码了(一)
Git应用开发学习 如果你还不会使用Git,那就不要写代码了. 一旦你会使用了Git,就再也不想使用SVN了.永远也回不去了. Mac上使用Git,肯定离不开对Mac上的操作.就要使用常用的Linux ...
- Zookeeeper的安装与集群搭建
简介 Zookeeper下载 官网地址:点我直达 百度云盘:点我直达 踩坑录 官网下载一定要下载带bin的 要不然zookeeper起不起来,找不到加载类,原来从版本3.5.5开始,带有bin名称的包 ...
- CDH安装详细测试正确
1. CDH简介 简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到 ...
- Java故障定位方法总结
多线程并发,程序执行速度较快,使用简单断点不能够定位到出错的线程: 通过打印日志,不断精确定位故障的位置和导致故障的原因. 在断点处设置condition为Thread.currentThread() ...
- Activiti定时任务
Activiti定时任务 作者:Jesai 傻逼一样的去坚持,就会有牛逼的结果 情景: 某公司有一个OA系统,审批环节是经理.有一天,经理出差了,然后下面突然有一份决定公司某个重大项目是否能顺利中标的 ...
- Node.js实操练习(一)之Node.js+MySQL+RESTful
前言 最近学习了一下node.js相关的内容,在这里初步做个小总结,说实话关于本篇博客的相关内容,自己很久之前就已经有过学习,但是你懂的,“好记性不如烂笔筒”,学过的东西不做笔记的话,很容易就会忘记的 ...
- 现在啊还不太清楚 nodejs和coffeescript 的关系
我怎么会思考这个问题,今天看到用coffeescript做的一个服务引导 挺好 看博客里提 安装node之后 呢 npm 可以安装coffeescript 难道 coffee 是 node的 一个方言 ...