news 2026/9/14 6:03:40

EF Core 源码构建完全指南:从环境准备、本地 SDK 安装到本地 NuGet 包打包

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EF Core 源码构建完全指南:从环境准备、本地 SDK 安装到本地 NuGet 包打包

EF Core 源码构建完全指南:从环境准备、本地 SDK 安装到本地 NuGet 包打包

【免费下载链接】efcoreEF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.项目地址: https://gitcode.com/GitHub_Trending/ef/efcore

本文基于 EF Core 仓库中的 getting-and-building-the-code.md 编写,系统讲解如何从零开始拉取、构建并测试 EF Core 源码:涵盖 SQL Server 与 Cosmos 测试前置环境、仓库自带的build/restore/test脚本族、global.json驱动的本地 .NET SDK 安装机制、build -pack本地 NuGet 包构建,以及 Visual Studio 集成与常见构建错误的排查方法。读完后你可以独立完成 EF Core main 分支的编译、测试和本地包分发验证。

适用范围:仅面向 main 分支

文档开宗明义:以下所有步骤仅适用于当前main 分支。EF Core 的构建体系会随版本迭代变化(例如 .NET SDK 版本、Arcade 工具链版本),如果你的工作基于某个 release 分支,请以该分支中的同名文档为准。

环境前置条件

EF Core 本身编译不需要额外安装任何前置组件(构建脚本会自行下载所需的 .NET SDK)。但运行测试时需要本地具备特定数据库:

SQL Server 测试:LocalDb 或独立 SQL Server

SQL Server 相关的功能测试要求本机有一个可用的 SQL Server 实例,可选方案:

  • SQL Server LocalDb:通常随安装 Visual Studio(选择 "ASP.NET and web development" 工作负载)一并获得,开箱即用;
  • SQL Server Express 或 Developer Edition:可运行在 Windows 或 Linux 上。注意:当不使用 LocalDb 时,必须设置环境变量Test__SqlServer__DefaultConnection,其值为测试应使用的连接字符串,否则测试无法定位数据库。

Cosmos 测试:Azure Cosmos 模拟器(可选)

  • 需要安装Azure Cosmos 模拟器并使用默认安装选项;每次重启机器后都要手动启动模拟器。
  • 该部分是可选的:如果模拟器不可用,Cosmos 测试会自动跳过。如果你不打算修改 Cosmos 相关代码,完全可以不装模拟器,交给 CI 系统去跑。
  • 实用技巧:在模拟器中关闭 "Rate Limiting"(限流),可以让 Cosmos 测试跑得更快——模拟限流会显著拖慢测试节奏,具体开关位置见上面的截图。

.NET SDK:非必需但强烈建议

虽然构建脚本在需要时会自行下载 SDK,但文档仍建议本机安装最新公共预览版 .NET SDK。这与仓库 global.json 的内容一致:

{ "sdk": { "version": "11.0.100-rc.1.26420.103", "allowPrerelease": true, "rollForward": "latestMajor", "paths": [".dotnet", "$host$"], "errorMessage": "The required .NET SDK wasn't found. Please run ./restore.sh or .\\restore.cmd to install it." }, "test": { "runner": "Microsoft.Testing.Platform" }, "msbuild-sdks": { "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26456.102" } }

从这份配置可以看出几个关键机制:

  • paths: [".dotnet", "$host$"]表示优先查找仓库根目录下的.dotnet文件夹(即构建脚本安装的本地 SDK),找不到再回落到系统全局安装的 SDK;
  • errorMessage字段明确提示:找不到 SDK 时请运行./restore.shrestore.cmd安装——这正是build作为"重要一步"的原因;
  • msbuild-sdks锁定了 Arcade 工具链(Microsoft.DotNet.Arcade.Sdk)版本,保证 MSBuild 行为与 dotnet 官方仓库一致;
  • test.runner声明测试通过Microsoft.Testing.Platform运行。

Fork 与 Clone

如果你的目的是向 EF Core 贡献代码,先在 GitHub 上创建 fork,再用你习惯的 git 客户端克隆仓库。克隆主仓库:

git clone https://github.com/dotnet/efcore.git

若已在个人账号下 fork 出名为efcore的仓库,则克隆自己的 fork:

git clone https://github.com/myusername/efcore.git

构建:build 脚本为什么是"重要一步"

构建代码只需在仓库根目录执行:

build

文档特别强调这是重要步骤(important step),因为它会在 EF Core 仓库旁边安装一份预览版 .NET SDK,确保 EF Core 始终使用预期的 SDK 与 MSBuild 版本进行编译。执行build同时完成还原包(restore)构建全部项目,但不运行测试

根目录脚本的真实调用链

文档给出的参数表中提到的根目录buildrestore.cmdtest.cmd等文件都是"薄封装"。从源码看,它们的实现极其简洁:

  • restore.cmd 的全部内容就是调用eng\common\build.ps1 -nodeReuse:$false -restore
  • restore.sh、test.sh 同理,分别调用 eng/common/build.sh 并附带--restore--test参数(同时传--nodeReuse false以避免复用 MSBuild 节点)。

也就是说,所有入口最终都汇聚到eng/common/build.ps1eng/common/build.sh这对核心脚本,它们把命令行开关翻译成 MSBuild 属性(/p:Restore=…/p:Build=…/p:Test=…/p:Pack=…等)再驱动构建。

常用构建参数

完整参数列表可通过build -h查看。文档列出的常用动作与对应脚本如下:

Build argumentActionScript file
-restoreRestore packages(还原 NuGet 包)restore.cmd
-buildBuild all projects(构建所有项目)build.cmd
-testRun all tests, requires build(运行全部测试,需先构建)test.cmd
-packBuild and produce NuGet packages(构建并产出 NuGet 包)None(无对应根目录脚本)

进一步阅读 eng/common/build.sh 中的usage()帮助文本,可以看到更多本地开发会用得到的参数:

参数作用
--rebuild重新构建(rebuild)
--clean清理artifacts目录
--integrationTest/--performanceTest运行集成测试 / 性能测试
--sourceBuild/--productBuild源构建 / 模拟 .NET 完整产品(VMR)构建方式,会连带触发 restore、build、pack
--configuration <value>构建配置:Debug(本地默认)或Release
--verbosity <value>MSBuild 详细度:quiet / minimal / normal / detailed / diagnostic
--binaryLog生成 MSBuild 二进制日志,方便用 MSBuild 日志查看器分析
--projects <value>指定要构建的项目或解决方案文件,而不是全仓库

未在上面列出的命令行参数会直接透传给 MSBuild(脚本源码中有properties+=("$1")的兜底分支),例如后文的/p:OfficialBuildId=…

构建本地 NuGet 包:OfficialBuildId 与本地包源

build -pack会把所有 EF Core NuGet 包构建到artifacts\packages目录。但这里有一个坑:无论构建多少次,包的版本号都不变,这会与 NuGet 的包缓存机制"打架"——缓存可能让你拿到的还是旧包。因此文档要求每次打包时指定新的内部构建号:

build /p:OfficialBuildId=20231212.6 -pack

构建号遵循 .NET 内部约定yyyyMMdd.x(日期 + 递增序号),每构建一批就把 "x" 加一。

要消费这些本地包,需要在你的解决方案或项目目录放置NuGet.config,把本地包目录加入包源。文档给出的完整示例:

<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="Local" value="C:\local\code\efcore\artifacts\packages\Debug\Shipping" /> </packageSources> </configuration>

注意Local源指向的是artifacts\packages\Debug\Shipping——即Debug配置下的 Shipping(正式发行)包目录;若你用 Release 配置打包,路径相应调整。

顺带一提,EF Core 仓库自身的 NuGet.config 也值得看一眼:它通过<clear />清空继承源后,显式添加了dotnet-engdotnet-toolsdotnet8dotnet12等一系列 Azure DevOps 公共 feed。这也正是后文排查构建错误时"检查包源 URL 是否可达"的对象——本地网络若访问不了这些 feed,restore 阶段就会失败。

在 Visual Studio 中使用源码

务必先执行一次命令行build,再打开解决方案。原因是构建脚本安装的是仓库本地的预览 SDK,而 IDE 默认走系统 SDK,两者版本不一致会引发奇怪的构建失败。

startvs.cmd 做了什么

文档推荐的入口命令:

startvs.cmd EFCore.sln

从 startvs.cmd 的源码可以确认它完成三件事:

  1. 设置DOTNET_ROOT指向仓库根目录下的.dotnet\(若定义了DOTNET_GLOBAL_INSTALL_DIR则优先使用),保证 .NET 使用仓库本地安装的dotnet.exe
  2. 把该目录插到 PATH 最前面,让 Visual Studio 找到正确的 SDK;
  3. 若本地dotnet.exe尚不存在,先自动调用restore.cmd补装;最后用start打开你传入的解决方案。

文档还提醒了两点:

  • startvs实际打开的是系统默认关联.sln的程序。如果你装了多个 IDE 或多个版本的 Visual Studio,请确认默认关联正确,或直接编辑脚本写死目标程序;
  • 如果你安装了最新的公共预览版 .NET SDK,理论上可以跳过startvs直接打开解决方案。但 EF Core 可能依赖比最新预览版更新的内部变更,直接打开出现意外错误时,请回到startvs方案,并确保 Visual Studio 也是最新预览版。

Linux/macOS 下可以查看 activate.sh 做类似配置:它export DOTNET_ROOT="$DIR/.dotnet"、把本地 dotnet 加入 PATH 头部,并定义deactivate函数用于还原环境。

运行测试

EF Core 的测试使用xUnit.net编写,绝大多数测试运行器都能跑。命令行方式(需要先完成 build):

test

test脚本(test.cmd/ test.sh)本质是带--test参数调用eng/common/build.ps1/eng/common/build.sh。结合前文前置条件,请留意:

  • SQL Server 测试依赖 LocalDb 或已配置Test__SqlServer__DefaultConnection的独立实例;
  • Cosmos 测试在模拟器不可用时会被跳过。

常见构建错误的排查步骤

文档给出的三步排查法,建议按顺序执行:

  1. 检查包源可达性:确认根目录 NuGet.config 中列出的包源 URL(如dotnet-engdotnet11等 feed)都能访问;
  2. 清理源码目录git clean -xid可清除 EF 源码目录中的未跟踪文件;
  3. 清理 NuGet 缓存nuget.exe locals all -clear会清空所有 NuGet 缓存(nuget.exe也可用dotnet nuget替代操作)。

这三步分别对应"网络/源问题"、"脏工作区问题"、"缓存污染问题"三类最常见的构建失败根因。

小结:关键文件速查

环节关键文件
本文主体docs/getting-and-building-the-code.md
SDK/工具链锁定global.json
包源配置NuGet.config
根入口脚本build.cmd、restore.cmd、test.cmd 及对应.sh
核心构建实现eng/common/build.sh、eng/common/build.ps1
IDE 环境注入startvs.cmd、activate.sh
Cosmos 限流开关截图docs/rate_limiting.png

掌握"前置条件 →build(装本地 SDK + restore + build)→test/build -packstartvs打开 IDE"这条主线,再配合global.jsonNuGet.configeng/common下的脚本源码,你就能在本地完整复现 EF Core 的构建与测试流程。

【免费下载链接】efcoreEF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.项目地址: https://gitcode.com/GitHub_Trending/ef/efcore

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 6:03:39

直播内容资产化:AI技术赋能高效复用与检索

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 6:02:54

300美元DIY三维扫描系统:USB相机+ESP32+Open3D实战指南

1. 这台“超便宜3D扫描仪”到底是什么&#xff1f;——拆解标题里的三个关键词陷阱 “Super cheap 3D Scanner/Camera/Controller”这个标题&#xff0c;第一眼容易让人联想到一台集成化、开箱即用的消费级3D扫描设备。但结合当前全网热搜词和实际技术生态来看&#xff0c;它根…

作者头像 李华
网站建设 2026/9/14 6:02:18

技术项目失败原因与工程师生存策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 6:00:33

PyTorch入门必学:用dir()和help()快速摸清API与环境配置

1. 两个内置函数&#xff0c;凭什么成为PyTorch入门的"探照灯" 很多同学第一次打开 PyTorch 官方文档时&#xff0c;心态基本是崩溃的——满屏的 torch.xxx 、 torch.Tensor.xxx &#xff0c;看两行就想关掉。我当初跟《PyTorch深度学习》这套教程学的时候&#…

作者头像 李华
网站建设 2026/9/14 5:58:53

Electron相机画面渲染性能优化实战

1. 项目概述&#xff1a;Electron相机画面渲染性能优化在开发基于Electron的桌面应用时&#xff0c;相机画面渲染性能往往是决定用户体验的关键指标。最近接手的一个视频会议项目就遇到了这个问题&#xff1a;当用户开启高清摄像头时&#xff0c;界面出现明显卡顿&#xff0c;C…

作者头像 李华
网站建设 2026/9/14 5:58:21

基于Vue3的中后台低代码可视化搭建平台实践与架构解析

1. 项目概述与整体设计思路1.1 核心需求解析&#xff1a;为什么选型低代码搭建中后台先说结论&#xff0c;再做解释。所谓中后台方向的低代码可视化搭建平台&#xff0c;本质上就是把“表单、表格、详情页、数据看板、流程审批”这些中后台系统里高频出现的页面&#xff0c;从传…

作者头像 李华