FastEndpoints 仓库开发工作流全解析:构建、测试、NuGet 可信发布与变更日志规范

发布时间:2026/10/6 2:18:28

FastEndpoints 仓库开发工作流全解析:构建、测试、NuGet 可信发布与变更日志规范 后端Web框架API设计【免费下载链接】FastEndpointsA light-weight REST API development framework for ASP.NET 8 and newer.项目地址https://gitcode.com/gh_mirrors/fa/FastEndpoints点击查看免费下载FastEndpoints 是一个面向 ASP.NET 8 的轻量级 REST API 开发框架其代码仓库以单仓库monorepo形式组织包含Src/各程序集、Tests/单元/集成/AOT 测试、TestHarness/示例宿主与.okf/仓库维护笔记等部分。本篇指南以仓库内部的工作流文档.okf/workflows.md为骨架系统讲解该仓库从环境准备、构建运行、测试执行到 NuGet 打包发布、变更日志维护与用户文档同步的完整日常流程帮助贡献者与维护者做到“本地操作与 CI 行为完全对齐”并深入理解其基于 GitHub OIDC 的可信发布Trusted Publishing机制。环境准备与 CI 对齐的本地开发环境工作流文档首先强调一个核心原则本地环境应与 CI 保持一致避免“本地能跑、流水线挂掉”的偏差。安装与 CI 匹配的 .NET SDK8.x、9.x、10.x 三套。发布流水线会通过actions/setup-dotnet同时安装这三个版本见 .github/workflows/publish-to-nuget.yml而 Azure 流水线则显式使用 10.xazure-pipeline.yml。测试项目默认目标框架为 net10.0由 Tests/Directory.Build.props 统一设定TargetFrameworknet10.0/TargetFramework同时开启Nullable、ImplicitUsings并声明xunit.v3、Shouldly、FakeItEasy等测试依赖配合根目录 Directory.Packages.props 的集中包管理测试项目里只写包名不写版本。核心单元/集成测试套件无需 docker-compose集成测试基于进程内 WAFWeb Application Factory运行不依赖外部数据库或消息中间件作业队列存储类测试使用内存/测试专用 provider。签名密钥文件就绪仓库根目录已包含FastEndpoints.snk与FastEndpointsPublic.snk测试程序集通过Tests/Directory.Build.props中的SignAssemblytrue/SignAssembly与AssemblyOriginatorKeyFile完成强名称签名公钥也内联在 props 中这也是InternalsVisibleTo能跨程序集生效的前提。构建与运行双解决方案与示例宿主仓库以“主解决方案 AOT 解决方案”的方式组织构建入口# 主解决方案覆盖全部 Src 与 Tests 项目含集中包管理还原 dotnet build FastEndpoints.slnx -c Release # AOT 解决方案NativeAOT 相关项目 dotnet build NativeAot.slnx -c Release # 示例宿主日常开发调试 dotnet run --project TestHarness/Web/Web.csproj # 清理所有 bin/obj 目录 ./clean.shFastEndpoints.slnx与NativeAot.slnx均位于仓库根目录。主解决方案承担日常构建、测试与打包NativeAot 解决方案对应 Tests/NativeAotTests 与 TestHarness/NativeAotChecker 的 AOT 场景。克隆后直接通过常规dotnet命令还原即可依赖集中包管理无需额外还原脚本。clean.sh的实现非常轻量用find递归定位所有bin、obj目录并删除clean.sh用于分支切换或构建缓存异常时快速重置产物。Sandbox 实验场TestHarness/Sandbox/Sandbox.slnx是一个独立的隔离实验解决方案含Contracts、Source、Tests三个项目适合做与主仓库互不干扰的临时验证。代码生成由 MSBuild targets 驱动具体约定见 generated-code.md。例如 Src/Generator/FastEndpoints.Generator.targets 中GenerateSerializerContexts默认falseSerializerContextOutputPath默认输出到Generated/FastEndpoints开启后会在CoreCompile之前调用FastEndpoints.Generator.Cli生成 STJ 序列化上下文开发模式下使用本地编译的Src/Generator.Cli/bin/.../net8.0/DLL包模式下则安装本地工具FastEndpoints.Generator.Cli。测试命令、CI 过滤器与 Kiota 跳过约定测试的完整约定xUnit v3 布局、AppFixture、命令/事件间谍、OpenAPI 快照等独立成篇详见 testing.md。这里仅提取与工作流直接相关的执行命令与 CI 过滤规则根目录 global.json 将Microsoft.Testing.Platform设为测试 runner因此dotnet test在 .NET 10 SDK 上走 MTPxunit.v3 4.0 起必需不再依赖 VSTest adapter。# 全解决方案测试与 GitHub 发布流水线完全一致 dotnet test FastEndpoints.slnx -c Release --verbosity minimal --filter ExcludeInCiCd!Yes --max-parallel-test-modules 1 # 按目录树测试Azure 流水线在 Tests 工作目录下执行 dotnet test Tests/**/*.csproj -c Release --filter ExcludeInCiCd!Yes --max-parallel-test-modules 1 # 定向测试 dotnet test Tests/UnitTests/FastEndpoints/Unit.FastEndpoints.csproj dotnet test Tests/IntegrationTests/FastEndpoints/Int.FastEndpoints.csproj --filter FullyQualifiedName~BindingTests三个关键约定值得注意--filter ExcludeInCiCd!Yes是统一的 CI 过滤器测试通过[Trait(ExcludeInCiCd, Yes)]标记后会在 GitHub 发布流水线与 Azure 流水线中被跳过如作业队列计时类、部分绑定用例这类测试不构成合并门禁。--max-parallel-test-modules 1限制模块级并行GitHub 与 Azure 流水线都会先用 Bash 重写Tests/IntegrationTests/FastEndpoints/xunit.runner.json关闭parallelizeAssembly与parallelizeTestCollections再配合该参数避免测试程序集在双核 runner 上互相抢占资源——因为FastEndpoints、FastEndpoints.OpenApi、FastEndpoints.Agents的集成 runner 存在进程级 FastEndpoints 全局状态不能并行跑集合。Kiota 集成项目在 CI 中被跳过Int.OpenApi.Kiota在CIGitHub或TF_BUILDAzure环境变量存在时会把IsTestingPlatformApplication/IsTestProject置为falseKiota 代码生成开销大且 MTP 以IsTestingPlatformApplication为判定依据本地dotnet test FastEndpoints.slnx仍会执行它。AOT 测试走NativeAot.slnx但发布流水线中对应的 AOT 测试步骤目前处于注释状态见 .github/workflows/publish-to-nuget.yml因此不能默认 CI 已执行 AOT 门禁应随时以流水线实际状态为准。打包与发布NuGet 发布流水线全解析FastEndpoints 采用NuGet 包发布模式无长期运行的服务需要部署GitHub Release 的正文直接取自 Src/Library/changelog.md。手动发布的等价命令dotnet pack FastEndpoints.slnx -c Release dotnet nuget push Src/**/*.nupkg -k NUGET_API_KEY -s https://api.nuget.org/v3/index.jsonGitHub Actionsv*标签触发 OIDC 可信发布发布流水线 .github/workflows/publish-to-nuget.yml 由v*标签推送触发完整步骤为安装 SDK 8/9/10actions/setup-dotnetv4dotnet-version多行声明三个版本。重写 xUnit runner 配置关闭程序集/集合级并行随后运行全解决方案测试使用上文提到的ExcludeInCiCd!Yes过滤器与--max-parallel-test-modules 1。dotnet pack FastEndpoints.slnx -c Release打包。NuGet/loginv1用 GitHub OIDC 换取临时 nuget.org API 密钥工作流中user: djnitehawk是nuget.org 的登录用户名注意与 GitHub 账号dj-nitehawk的拼写差异——前者没有连字符。用临时密钥dotnet nuget push并附加--skip-duplicate。为什么需要这个开关因为独立版本化的 Agents 包FastEndpoints.Mcp/FastEndpoints.A2A也随主解决方案一起打包当其版本号未变化时 nuget.org 上已存在同名同版包跳过重复即可避免整条发布失败——这正是不保存长期有效 API 密钥、采用可信发布的动因。非 beta 标签创建 GitHub Release使用softprops/action-gh-releasev2body_path直接指向 Src/Library/changelog.mdbeta 标签github.ref含beta则跳过该步骤。作业权限Job permissions仅两枚id-token: writeOIDC 换密钥与contents: write创建 GitHub Release遵循最小权限原则。可信发布策略还需要在 nuget.org 侧完成匹配配置owner 为FastEndpoints、repo 为FastEndpoints、工作流文件名为publish-to-nuget.yml仅匹配文件名不匹配完整路径。Azure Pipelines只测试、不发布azure-pipeline.yml 同样以v*标签触发branches全部排除仅标签但职责更轻安装 .NET 10 SDK含预览版→ 重写 xUnit runner 配置 → 在Tests工作目录下对Tests/**/*.csproj运行测试同样带ExcludeInCiCd!Yes过滤器与--max-parallel-test-modules 1。该文件不包含任何 pack/push 步骤发布动作完全由 GitHub Actions 承担两条流水线形成“双保险测试 单点发布”的格局。变更日志Changelog规范Src/Library/changelog.md是滚动式的当前发布周期更新说明非 beta 标签发布时整份文件直接作为 GitHub Release 正文。规范要点如下不是 Keep-a-Changelog 风格不设版本号标题、不重置/不重写文件、保留文件顶部的赞助横幅sponsorship banner与既有全部条目。何时需要更新与面向用户的库改动在同一提交中完成新增公共 API/包/功能、用户可见的 bug 修复、显著的性能或行为改进、破坏性变更。明确跳过纯测试改动、OKF 仓库笔记、注释、CI 配置、格式调整、无消费者影响的内部重构、仅 FE-Docs 的编辑。同一变更不要重复添加details条目。结构要求新条目以details形式紧跟对应标题下方前置插入最新在上且不得自行新增标题。固定标题只有四类## New ## Fixes ## Improvements ## Minor Breaking Changes ⚠️条目模板与措辞文件顶部保留了 HTML 注释模板[//]: # (detailssummarytitle text/summary/details)见 Src/Library/changelog.md。summary写面向用户的标题正文写简短的对消费者有意义的描述可附一小段代码示例summary 陈述消费者影响而非实现细节。破坏性变更条目必须说明“破坏了什么”以及“如何迁移”。实际条目示例节选自当前 Src/Library/changelog.mdFinancialIdempotency()金融级幂等条目不仅描述行为语义预留幂等键、回放原始 2xx、同键不同载荷返回 409还给出AddFinancialIdempotency()UseFinancialIdempotency()注册与端点配置的完整代码DontVersion()条目则明确说明“最后调用生效”的边界Version(1)后再DontVersion()会取消版本段。新公共行为的默认交付物是“改库 写 changelog 更新 FE-Docs”三件事一起完成。代码风格与格式风格主要靠 .editorconfig ReSharper/Rider DotSettings 约束仓库根目录存在FastEndpoints.sln.DotSettings相关配置其中.user后缀为本地用户级文件不入库生效。从已检查的仓库文件看CI 不强制运行独立的dotnet format脚本编辑代码时遵循 editorconfig 与 IDE 提示即可。代码生成与迁移Roslyn 生成器、序列化上下文、OpenAPI 导出等生成物的完整约定见 generated-code.mdSrc/Generator下五个生成器各司其职DiscoveredTypesGenerator生成 AOT 友好的类型清单、AccessControlGenerator生成权限常量、ReflectionGenerator生成反射缓存、ServiceRegistrationGenerator生成 DI 注册、GenericProcessorTypesGenerator生成泛型处理器实例化MSBuild 侧由 Src/Generator/FastEndpoints.Generator.targets 统一驱动。生成物消费者Generated/目录、打包后的 analyzer 二进制等严禁手工编辑需要改动时应修改生成器源码或 targets 后重新构建。仓库内没有数据库迁移No DB migrations in-repo。面向用户的文档FE-Docs用户文档位于仓库外部的兄弟仓库 FE-DocsSvelteKit 站点内容存于其src/content/docs/编号主题下提供官方发布站点与预览站点文档中给出的地址为 fast-endpoints.com 与其 pages.dev 预览域名。FE-Docs 与本仓库的测试/发布流程完全解耦——不参与本仓库任何解决方案的构建也不在发布工作流中生成。何时更新 FE-Docs当变更对用户可见时公共 API、配置、端点/消息/作业/安全/OpenAPI/AOT 行为、破坏性变更、新功能更新内容需匹配相邻页面风格不要把文档页内容粘贴进 OKF 笔记。同一类变更通常同时需要 changelog 条目见上文两条线都要做。本地运行方式在兄弟 FE-Docs 检出目录中执行即文档所述的../FE-Docs/位置该目录位于当前仓库之外npm install # 首次 npm run dev npm run build环境变量与密钥仅名称不涉值名称用途应用配置键如TokenKey示例宿主TestHarness的 JWT 签名密钥仅示例用途可参考的仓库文件清单工作流文档所依据的核心仓库文件均可直接打开佐证.github/workflows/publish-to-nuget.yml — GitHub 发布流水线测试、打包、OIDC 推送、Release 创建azure-pipeline.yml — Azure 测试流水线仅测试不发布Src/Library/changelog.md — 滚动变更日志同时充当 GitHub Release 正文Tests/Directory.Build.props — 测试 TFMnet10.0、签名与公共测试依赖Src/Generator/FastEndpoints.Generator.targets — 代码生成 MSBuild 钩子clean.sh — bin/obj 清理脚本global.json — MTP 测试 runner 声明测试细节testing.md代码生成细节generated-code.mdFE-Docs 兄弟仓库侧的README.md与package.json位于本仓库之外的../FE-Docs/目录赞分享后端Web框架API设计【免费下载链接】FastEndpointsA light-weight REST API development framework for ASP.NET 8 and newer.项目地址https://gitcode.com/gh_mirrors/fa/FastEndpoints点击查看免费下载相关推荐CANN HIXL 仓库开发工作流指南仓库导航、构建测试与提交规范全解析CANN HIXL 仓库开发工作流指南仓库导航、构建测试与提交规范全解析 HIXLHuawei Xfer Library是面向昇腾芯片的单边通信库支撑通信网络高性能计算CANNAscendPhoenix TypeScript 包开发规范与工作流js/ 多包仓库的构建、测试与发布指南Phoenix TypeScript 包开发规范与工作流js/ 多包仓库的构建、测试与发布指南 导读 Phoenix 的 TypeScript 生态全部收敛在可观测性AI 评测LLMOpsAI 应用人工智能SpacetimeDB发布流程版本发布与变更日志的规范SpacetimeDB发布流程版本发布与变更日志的规范 引言 在开源项目的生命周期中规范的发布流程和变更日志管理是确保项目健康发展的关键因素。Spaceti数据库关系型数据库后端上一篇3大字体设计痛点与Plus Jakarta Sans的现代解决方案城市美学与数字排版的完美融合下一篇如何快速搭建个人数字图书馆Talebook完整部署指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/6 2:18:28

InnoDB存储结构:记录在页里,为什么不从第一行一直找?

我最开始整理 InnoDB,列了很多问题:没建索引怎么存?页里有什么?记录为什么有 next_record?长字符串放哪里?问题不少,却没有把它们连接起来。 这次先抓一个问题:索引已经找到某个叶子…

2026/10/6 3:23:32

从请求报文到线上排障:HTTP协议系统性理解与实战指南

前两天帮同事排查一个线上接口问题,他把浏览器里复制出来的 curl 命令直接甩给我,附带一句“帮我看看为啥接口超时”。我问他“超时是连接超时还是读超时,TTFB 多少,看没看响应头的 Cache-Control”,他愣了一下&#x…

2026/10/6 3:23:32

std::list 底层探秘:双向链表、哨兵节点与实现细节

很多人都在用std::list,可一旦被问到它底层到底怎么实现的,十有八九会卡壳。std::list底层是一个双向链表,节点在堆上独立分配,通过prev和next指针串起来,跟vector那种连续内存完全是两个世界。它解决的是序列容器里“…

2026/10/6 3:23:32

H.264分析工具实战:从NALU到宏块定位视频花屏与卡顿

简介:H.264分析工具是一套面向视频编码开发与调试的H.264/AVC码流解析资源,适合视频工程师、编解码学习者和内容创作者使用。包内共186个文件,以C/C源码(h与cpp文件)为主,同时包含可执行程序、示例H.264/H.…

2026/10/6 3:23:32

微信小程序商城毕设全解析:环境配置、避坑指南与二次开发

简介:这套毕业设计资源基于微信小程序打造完整商城项目,适合计算机相关专业学生完成毕业设计或课程设计,也适合刚入门小程序开发的新手对照学习。项目包含前端小程序页面与后端服务代码,覆盖商城、商品详情、发现、我的、支付、消…

2026/10/6 3:23:32

25个你一定要掌握的JavaScript技巧,是新手到高手的进阶秘籍!

JavaScript 一直在更新,变得越来越好用。从 ES6 开始,加入了很多新写法,能让你的代码更短、更清楚,也常常运行得更快。掌握这些技巧,不仅能让你写代码更快,还能让代码更容易让别人看懂和维护,代…

2026/10/6 3:18:31

旧电脑改造NAS全攻略:硬件选型到数据备份的实战指南

家里那台旧电脑吃灰半年后,我总算给它找了个正经归宿——自建一台家用NAS。折腾下来最大的感受是:网上教程多,但能一口气把事情讲透的太少。要么只给你甩几条命令,要么上来就推高价成品机,很少有人把“为什么要这样选”…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑