• 如何开始阅读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的(如果你本机已经安装过了,但是脚本提示找不到),你可以直接查看编译脚本,.uild.ps1(或.uild.sh)文件。

    还原

    当编译环境准备好以后,记得开启新的命令行窗口,因为新增的环境变量只在安装后启动的命令行中生效。
    前面克隆到本机的是最新的代码(更新频繁),但是对于大多数人来说,我们只关注自己目前正在使用的版本。
    ASP.NET Core所有版本的发布都打了标签(tag)。
    因此,我们可以先使用git命令列出所有的版本。

    git tag

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

    git checkout v3.1.0

    在你使用Visual Studio或VS Code浏览代码之前需要运行. estore.cmd(Windows环境,Linux和macOS请使用对应的.sh文件,下同)来还原编译所依赖的运行环境和各种组件。
    每次源代码有大的更新时,你都需要重新运行. estore.cmd。
    运行. estore.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项目的解决方案,巨大无比吧。

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

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

  • 相关阅读:
    关于jpa example使用
    文件下载
    文件夹下的文件根据最后修改时间排序
    前端验证图片是否加载成功
    LocalDate获取当天,本月第一天,本月最后一天,今年第一天,今年最后一天
    将word文档合成一张图片输出
    easyui前端分页与layui前端分页
    Java线程池源码流程图
    hexo发布到gitee和github上及主题优化
    【JVM之美】垃圾收集算法
  • 原文地址:https://www.cnblogs.com/wenhx/p/Build-ASP-NET-Core-from-Source.html
Copyright © 2020-2023  润新知