.NET runtime 的 Area Owners 机制:issue/PR 的路由、负责人标注与订阅通知全解析
【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime
本文基于 dotnet/runtime 仓库的 area-owners.md 文档展开,讲解 .NET 运行时社区如何用“区域负责人(area owners)”体系把海量 issue 和 PR 路由到正确的专家手中:既包括人工 @ 谁、@ Lead 还是 @ Owner 的标注约定,也包括背后由 Policy Service 自动驱动的通知、清理与 CODEOWNERS 路径级评审联动机制。读完本文,你既能快速查到自己关心的模块(如System.Net、GC、JIT、WASM 等)该找谁,也能理解一个社区成员如何以 PR 的方式订阅某个 area 的通知,以及自动化流水线如何围绕area-*标签运转。
一、标注(Tagging)基本约定:@ Owner,而不是 @ Lead
area-owners.md 开篇给出的核心约定是:
当你在某个 issue 或 PR 中需要 @ 相关人员时,一般应该 @ 该变更或 issue 所最贴近的区域(area)的 owners(而不是 lead)。对于较大、且可能按操作系统或架构细分的区域,更好的做法是 @ 对应 OS 或 Architecture 的负责人。
这里有两个角色需要区分(对应文档表格的两列):
| 角色 | 含义 | 何时 @ |
|---|---|---|
| Lead | 区域的总体负责人 | 一般不直接 @,用于区域整体方向负责 |
| Owners | 区域专家(area experts) | 提 issue/PR 时 @ 他们,是他们来认领和评审 |
从 area-owners.md 的表格看,Owners 列中既包含个人(如@elinor-fung),也包含 GitHub 团队(如@dotnet/ncl、@dotnet/jit-contrib、@dotnet/gc)。用团队而非个人来承接通知,是 .NET 仓库应对人员流动的典型设计:人员变化只需调整团队名单,路由规则保持不变。
此外,该表格仅适用于dotnet/runtime 仓库本身;文档明确说明 ASP.NET Core 仓库维护自己的区域负责人列表,二者互不替代。
二、区域(Areas)完整责任表
以下是 area-owners.md 中 Areas 表的完整内容(Area 标签名、Lead、应被 @ 的 Owners 及备注)。这是全文档的核心骨架,建议收藏备用:
| Area | Lead | Owners(PR/issue 中应 @ 的区域专家) | 备注 |
|---|---|---|---|
| area-Announcements | @jamshedd | @bribrothers @rbhanda | .NET 产品公告与安全通告 |
| area-AssemblyLoader | @agocke | @agocke @elinor-fung | |
| area-AssemblyLoader-mono | @agocke | @agocke @elinor-fung | |
| area-Build-mono | @lewing | @akoeplinger | |
| area-Codeflow | @dotnet/dnr-codeflow | @dotnet/dnr-codeflow | 用于从其他仓库自动同步代码的自动化 PR |
| area-Codegen-AOT-mono | @steveisok | @kotlarmilos | |
| area-CodeGen-coreclr | @JulieLeeMSFT | @dotnet/jit-contrib | |
| area-Codegen-Interpreter-coreclr | @JulieLeeMSFT | @BrzVlad @janvorli | |
| area-Codegen-Interpreter-mono | @vitek-karas | @BrzVlad @kotlarmilos | |
| area-Codegen-Intrinsics-mono | @steveisok | ||
| area-Codegen-JIT-mono | @steveisok | ||
| area-Codegen-LLVM-mono | @steveisok | ||
| area-Codegen-meta-mono | @steveisok | ||
| area-Debugger-mono | @steveisok | @thaystg @dotnet/dotnet-diag | |
| area-DependencyModel | @jeffhandley | @dotnet/area-dependencymodel | 包含 Microsoft.Extensions.DependencyModel |
| area-Diagnostics-cdac | @steveisok | @tommcdon @dotnet/dotnet-diag | |
| area-Diagnostics-coreclr | @steveisok | @tommcdon @dotnet/dotnet-diag | |
| area-Diagnostics-mono | @steveisok | @tommcdon @mdh1418 @thaystg | |
| area-EnC-mono | @steveisok | @dotnet/dotnet-diag @thaystg | WebAssembly、Android、iOS 等的热重载(Hot Reload) |
| area-Extensions-Caching | @anicka-net | @dotnet/area-extensions-caching | 顾问(Consultants):@adamsitnik、@mgravell、@sebastienros |
| area-Extensions-Configuration | @anicka-net | @dotnet/area-extensions-configuration | 顾问:@tarekgh、@eerhardt |
| area-Extensions-DependencyInjection | @anicka-net | @dotnet/area-extensions-dependencyinjection | 顾问:@halter73、@benjaminpetit |
| area-Extensions-FileSystem | @anicka-net | @dotnet/area-extensions-filesystem | 顾问:@jozkee、@adamsitnik |
| area-Extensions-Hosting | @anicka-net | @dotnet/area-extensions-hosting | 顾问:@halter73、@tratcher |
| area-Extensions-HttpClientFactory | @karelz | @dotnet/ncl | |
| area-Extensions-Logging | @anicka-net | @dotnet/area-extensions-logging | 顾问:@tarekgh、@brennanconroy |
| area-Extensions-Options | @anicka-net | @dotnet/area-extensions-options | 顾问:@tarekgh、@eerhardt、@brennanconroy |
| area-Extensions-Primitives | @anicka-net | @dotnet/area-extensions-primitives | |
| area-GC-coreclr | @anicka-net | @dotnet/gc | |
| area-GC-mono | @agocke | @BrzVlad | 可咨询 @agocke |
| area-Host | @agocke | @elinor-fung | 与 dotnet.exe 相关的问题,包括引导、框架探测、hostfxr.dll 与 hostpolicy.dll |
| area-ILTools-coreclr | @JulieLeeMSFT | @dotnet/jit-contrib | |
| area-Infrastructure | @agocke | @dotnet/runtime-infrastructure | 顾问:@MichaelSimons |
| area-Infrastructure-installer | @MichaelSimons | @NikolaMilosavljevic | |
| area-Infrastructure-libraries | @jeffhandley | @dotnet/area-infrastructure-libraries | 覆盖:打包(Packaging)、libraries 的构建与测试基础设施、VS 集成 |
| area-Infrastructure-mono | @steveisok | @akoeplinger @matouskozak @simonrozsival | |
| area-Interop-coreclr | @agocke | @dotnet/interop-contrib | |
| area-Interop-mono | @agocke | @AaronRobinsonMSFT @jkoritzinsky | |
| area-Meta | @jeffhandley | @dotnet/area-meta | 跨区域的横切问题,包括全项目级的代码/测试模式与文档 |
| area-Microsoft.CSharp | @phil-allen-msft | @333fred | 已归档组件,变更/贡献有限 |
| area-Microsoft.VisualBasic | @phil-allen-msft | @333fred | 已归档组件,变更/贡献有限 |
| area-Microsoft.Win32 | @jeffhandley | @dotnet/area-microsoft-win32 | 包含 System.Windows.Extensions |
| area-NativeAOT-coreclr | @agocke | @dotnet/ilc-contrib | |
| area-ReadyToRun | @agocke | @dotnet/crossgen-contrib | |
| area-Serialization | @StephenMolloy | @StephenMolloy @dotnet/Tellurium | 包含 System.Runtime.Serialization.Xml、System.Runtime.Serialization.Json、System.Private.DataContractSerialization、System.Xml.XmlSerializer;不含 System.Runtime.Serialization.Formatters |
| area-Setup | @MichaelSimons | @NikolaMilosavljevic | 各发行版(Linux、Mac、Windows)的安装包与 msi 文件 |
| area-Single-File | @agocke | @elinor-fung @vsadov | |
| area-Snap | @MichaelSimons | @NikolaMilosavljevic @leecow @MichaelSimons | |
| area-System.Buffers | @jeffhandley | @dotnet/area-system-buffers | |
| area-System.ClientModel | @jeffhandley | @dotnet/fxdc | 缺陷与功能请求应提交到 Azure SDK for .NET 仓库;FXDC 审查与 System 概念重叠的变更 |
| area-System.CodeDom | @jeffhandley | @dotnet/area-system-codedom | |
| area-System.Collections | @jeffhandley | @dotnet/area-system-collections | 不含 System.Array(归属 System.Runtime) |
| area-System.ComponentModel | @jeffhandley | @dotnet/area-system-componentmodel | 顾问:@dotnet/dotnet-winforms |
| area-System.ComponentModel.Composition | @jeffhandley | @dotnet/area-system-componentmodel-composition | |
| area-System.ComponentModel.DataAnnotations | @jeffhandley | @dotnet/area-system-componentmodel-dataannotations | 包含 System.ComponentModel.Annotations |
| area-System.Composition | @jeffhandley | @dotnet/area-system-composition | |
| area-System.Configuration | @jeffhandley | @dotnet/area-system-configuration | |
| area-System.Console | @jeffhandley | @dotnet/area-system-console | |
| area-System.Data | @SamMonoRT | @dotnet/efteam | Odbc、OleDb 可找 @saurabh500 |
| area-System.Data.Odbc | @SamMonoRT | @dotnet/efteam | |
| area-System.Data.OleDB | @SamMonoRT | @dotnet/efteam | |
| area-System.Data.SqlClient | @David-Engel | @cheenamalhotra @david-engel | 已归档组件(Microsoft.Data.SqlClient 已独立演进) |
| area-System.DateTime | @jeffhandley | @dotnet/area-system-datetime | System 命名空间下与日期时间相关的 API:DateOnly、DateTime、DateTimeKind、DateTimeOffset、DayOfWeek、TimeOnly、TimeSpan、TimeZone、TimeZoneInfo |
| area-System.Diagnostics | @steveisok | @dotnet/area-system-diagnostics | |
| area-System.Diagnostics-coreclr | @steveisok | @dotnet/area-system-diagnostics-coreclr | |
| area-System.Diagnostics-mono | @steveisok | @dotnet/dotnet-diag | |
| area-System.Diagnostics.Activity | @jeffhandley | @dotnet/area-system-diagnostics-activity | |
| area-System.Diagnostics.EventLog | @jeffhandley | @dotnet/area-system-diagnostics-eventlog | |
| area-System.Diagnostics.Metric | @jeffhandley | @dotnet/area-system-diagnostics-metric | |
| area-System.Diagnostics.PerformanceCounter | @jeffhandley | @dotnet/area-system-diagnostics-performancecounter | |
| area-System.Diagnostics.Process | @SamMonoRT | @dotnet/area-system-diagnostics-process | |
| area-System.Diagnostics.Tracing | @steveisok | @dotnet/area-system-diagnostics-tracing | 包含 System.Diagnostics.DiagnosticSource |
| area-System.Diagnostics.TraceSource | @jeffhandley | @dotnet/area-system-diagnostics-tracesource | |
| area-System.DirectoryServices | @jeffhandley | @dotnet/area-system-directoryservices | 顾问:@BRDPM @grubioe @jay98014 |
| area-System.Drawing | @jeffhandley | @dotnet/area-system-drawing | 不含 System.Drawing.Common(归属 winforms) |
| area-System.Dynamic.Runtime | @phil-allen-msft | @333fred | 已归档组件 |
| area-System.Formats.Asn1 | @jeffhandley | @dotnet/area-system-formats-asn1 | 顾问:@bartonjs @vcsjones |
| area-System.Formats.Cbor | @jeffhandley | @dotnet/area-system-formats-cbor | 顾问:@bartonjs @vcsjones |
| area-System.Formats.Nrbf | @jeffhandley | @dotnet/area-system-formats-nrbf | 顾问:@bartonjs @grabyourpitchforks |
| area-System.Formats.Tar | @karelz | @dotnet/area-system-formats-tar | |
| area-System.Globalization | @jeffhandley | @dotnet/area-system-globalization | |
| area-System.IO | @jeffhandley | @dotnet/area-system-io | |
| area-System.IO.Compression | @karelz | @dotnet/area-system-io-compression | 包含 System.Formats.Tar、System.IO.Packaging |
| area-System.IO.Hashing | @jeffhandley | @bartonjs @vcsjones @dotnet/area-system-io-hashing | System.IO.Hashing 命名空间的 API,更贴近密码学而非 I/O |
| area-System.IO.Pipelines | @joperezr | @davidfowl @halter73 | |
| area-System.IO.Ports | @jeffhandley | @dotnet/area-system-io-ports | |
| area-System.Linq | @jeffhandley | @dotnet/area-system-linq | |
| area-System.Linq.Expressions | @phil-allen-msft | @333fred | 已归档组件 |
| area-System.Linq.Parallel | @jeffhandley | @dotnet/area-system-linq-parallel | 顾问:@stephentoub @kouvel |
| area-System.Management | @jeffhandley | @dotnet/area-system-management | WMI |
| area-System.Memory | @jeffhandley | @dotnet/area-system-memory | |
| area-System.Net | @karelz | @dotnet/ncl | 包含 System.Uri |
| area-System.Net.Http | @karelz | @dotnet/ncl | |
| area-System.Net.Quic | @karelz | @dotnet/ncl | |
| area-System.Net.Security | @karelz | @dotnet/ncl @bartonjs @vcsjones | |
| area-System.Net.Sockets | @karelz | @dotnet/ncl | |
| area-System.Numerics | @jeffhandley | @dotnet/area-system-numerics | |
| area-System.Numerics.Tensors | @jeffhandley | @dotnet/area-system-numerics-tensors | |
| area-System.Reflection | @steveisok | @dotnet/area-system-reflection | 顾问:@ericstj |
| area-System.Reflection.Emit | @steveisok | @dotnet/area-system-reflection-emit | 顾问:@ericstj |
| area-System.Reflection.Metadata | @agocke | @dotnet/area-system-reflection-metadata | 顾问:@ericstj、@tmat |
| area-System.Resources | @jeffhandley | @dotnet/area-system-resources | |
| area-System.Runtime | @jeffhandley | @dotnet/area-system-runtime | 包含 System.Runtime.Serialization.Formatters、System.Runtime.InteropServices.RuntimeInfo、System.Array;不含 Path(-> System.IO)、StopWatch(-> System.Diagnostics)、Uri(-> System.Net)、WebUtility(-> System.Net) |
| area-System.Runtime.Caching | @StephenMolloy | @StephenMolloy @dotnet/Tellurium | |
| area-System.Runtime.CompilerServices | @jeffhandley | @dotnet/area-system-runtime-compilerservices | |
| area-System.Runtime.InteropServices | @agocke | @dotnet/interop-contrib | 不含 System.Runtime.InteropServices.RuntimeInfo |
| area-System.Runtime.InteropServices.JavaScript | @lewing | @pavelsavara | |
| area-System.Runtime.Intrinsics | @jeffhandley | @dotnet/area-system-runtime-intrinsics | 顾问:@echesakovMSFT @kunalspathak |
| area-System.Security | @jeffhandley | @bartonjs @vcsjones @dotnet/area-system-security | 顾问:@GrabYourPitchforks @wfurt |
| area-System.ServiceModel | @mconnew | @mconnew @dotnet/Tellurium | 代码在独立的 WCF 仓库;涵盖 System.ServiceModel.Primitives / Http / NetTcp / Duplex / Security 等包 |
| area-System.ServiceModel.Syndication | @StephenMolloy | @StephenMolloy @dotnet/Tellurium | |
| area-System.ServiceProcess | @jeffhandley | @dotnet/area-system-serviceprocess | |
| area-System.Speech | @jeffhandley | @dotnet/area-system-speech | |
| area-System.Text.Encoding | @jeffhandley | @dotnet/area-system-text-encoding | |
| area-System.Text.Encodings.Web | @jeffhandley | @dotnet/area-system-text-encodings-web | |
| area-System.Text.Json | @jeffhandley | @dotnet/area-system-text-json | |
| area-System.Text.RegularExpressions | @jeffhandley | @dotnet/area-system-text-regularexpressions | 顾问:@stephentoub |
| area-System.Threading | @JulieLeeMSFT | @vsadov | |
| area-System.Threading.Channels | @jeffhandley | @dotnet/area-system-threading-channels | 顾问:@stephentoub |
| area-System.Threading.RateLimiting | @rafikiassumani-msft | @BrennanConroy @halter73 | |
| area-System.Threading.Tasks | @jeffhandley | @dotnet/area-system-threading-tasks | 顾问:@stephentoub |
| area-System.Transactions | @SamMonoRT | @dotnet/efteam | |
| area-System.Xml | @jeffhandley | @dotnet/area-system-xml | |
| area-TieredCompilation-coreclr | @JulieLeeMSFT | @vsadov | |
| area-Tools-ILLink | @agocke | @dotnet/illink | |
| area-Tools-ILVerification | @JulieLeeMSFT | @dotnet/jit-contrib | |
| area-Tracing-coreclr | @steveisok | @dotnet/area-tracing-coreclr | EventPipe 与 ICorProfiler 相关的运行时问题 |
| area-Tracing-mono | @steveisok | @dotnet/dotnet-diag @thaystg | |
| area-TypeSystem-coreclr | @agocke | @davidwrighton @MichalStrehovsky @janvorli @agocke | |
| area-VM-coreclr | @agocke | @agocke @vsadov | |
| area-VM-meta-mono | @steveisok | @vitek-karas | |
| area-VM-reflection-mono | @steveisok | @vitek-karas | MonoVM 特有的反射与 reflection-emit 问题 |
| area-VM-threading-mono | @agocke | @steveisok | |
| area-Workloads | @lewing | @dotnet/net-sdk-workload-contributors |
从表格的组织方式可以读出几条 .NET 仓库的责任划分规律:
- 运行时内核按“引擎 × 子系统”切分:CoreCLR 侧有
area-CodeGen-coreclr(JIT)、area-GC-coreclr、area-VM-coreclr、area-TypeSystem-coreclr、area-Tracing-coreclr;Mono 侧有area-Codegen-JIT-mono、area-GC-mono、area-VM-*-mono等,-mono后缀显式区分两套运行时实现。 - 库(libraries)按命名空间一对一映射:
area-System.*与System.*命名空间几乎一一对应,备注列还精确标注了“包含/排除”的边界(例如System.Array归area-System.Runtime而不归area-System.Collections),避免责任灰区。 - “Consultants(顾问)”是第三层角色:部分区域在 Owners 之外另列顾问(如
area-System.Security的顾问 @bartonjs、@vcsjones),用于疑难问题咨询而非例行评审。 - 已归档组件被显式标注:如
area-Microsoft.CSharp、area-System.Linq.Expressions、area-System.Data.SqlClient等备注为“Archived component - limited churn/contributions”,提示贡献者这些组件变更很少、可能有专门的维护策略。
三、操作系统维度的负责人(OS Owners)
对于跨平台的 issue,仅按 area 路由可能不够,os-标签提供了第二维度的责任归属。area-owners.md 明确:未列入下表(见下)的os-标签没有显式负责人。
注意(原文档注释):这里的“ownership”只表示工程团队(或社区)中哪一部分对带有该标签的 issue 负责修复,与“是否受支持”无关。例如这里不单独跟踪
os-windows,因为 Windows 的 bug 由常规 area 负责人负责,没有专门的 OS lead/owner;但 Windows 当然是受支持的操作系统。
| Operating System | Lead | Owners |
|---|---|---|
| os-android | @vitek-karas | @akoeplinger |
| os-freebsd | @wfurt @Thefrank @sec | |
| os-maccatalyst | @vitek-karas | @kotlarmilos |
| os-ios | @vitek-karas | @kotlarmilos |
| os-tizen | @gbalykov | @dotnet/samsung |
| os-tvos | @vitek-karas | @kotlarmilos |
| os-wasi | @lewing | @pavelsavara @kotlarmilos |
| os-browser | @lewing | @pavelsavara @kotlarmilos |
可以看到移动端与 WebAssembly 系平台(iOS/tvOS/macCatalyst 由 @kotlarmilos 主责;Android 由 @akoeplinger 主责;wasi/browser 由 @pavelsavara 与 @kotlarmilos 共同负责)都有明确的负责人,这与仓库中src/mono/wasm、src/mono/wasi、src/mono/browser等目录的实际维护分工相吻合。
四、架构维度的负责人(Arch Owners)
同理,未列入下表的arch-标签没有显式负责人(“ownership 不等于支持”的说明与 OS 一节相同):
| Architecture | Lead | Owners |
|---|---|---|
| arch-loongarch64 | @shushanhf | @LuckyXu-HF |
| arch-riscv | @gbalykov | @dotnet/samsung |
| arch-s390x | @uweigand | @uweigand |
| arch-wasm | @lewing | @lewing、@pavelsavara、@kotlarmilos |
五、社区分类员(Community Triagers)
文档还单列了一组社区分类员。他们不一定固定负责某个 area,但拥有协助 issue 与 PR 的路由和打标签的权限,并且熟悉仓库的运作方式:
@a74nh、@am11、@clamp03、@Clockwork-Muse、@filipnavara、@huoyaoyuan、@martincostello、@omajid、@Sergio0694、@shushanhf、@SingleAccretion、@teo-tsirpanis、@tmds、@vcsjones、@xoofx。
对社区贡献者而言,当你不确定某个 issue 该打哪个area-*标签时,这些 triager 是最合适的求助对象。
六、从文档表格到自动化:area-*标签背后的通知流水线
area-owners.md 中有一段关键说明:直接编辑该 md 文件,并不会更新@dotnet-policy-service用于区域通知的映射。真正驱动通知的配置是 resourceManagement.yml,且许多 area 使用 GitHub 团队来接收通知。下面结合仓库内的实际配置,拆解这套自动化如何工作。
6.1 标签从哪来:issue-labeler 自动预测area-*标签
仓库通过 labeler-readme.md 说明了标签预测流水线:仓库引入了 dotnet/issue-labeler 的动作,从上游导入并本地化了 5 个 workflow 模板(均可在 .github/workflows/ 中找到):
labeler-cache-retention.ymllabeler-predict-issues.ymllabeler-predict-pulls.ymllabeler-promote.ymllabeler-train.yml
本地化配置的关键点(见 labeler-readme.md 的 “Repository Configuration” 一节):
| 配置项 | 取值 | 含义 |
|---|---|---|
LABEL_PREFIX | area- | 预测出的标签统一带area-前缀,与 area-owners.md 中的 Area 列对应 |
DEFAULT_LABEL | needs-area-label | 预测置信度不足时打上此“待人工分类”标签 |
ISSUE_LABELER_PREDICTION_THRESHOLD | 默认0.05 | 应用 area 标签的最低预测置信度阈值(可用仓库变量覆盖) |
| PR 打标分支 | main和release/* | PR 只在这些分支上被预测打标 |
也就是说,一个新 issue/PR 先由模型预测出area-System.Net这类标签;置信度低于阈值时回落到needs-area-label,等待 triager 人工介入。
6.2 标签触发订阅通知:eventResponderTasks 与 mentionUsers
resourceManagement.yml(2100 余行)中,eventResponderTasks定义了“标签事件响应”规则。以 第 118-137 行 附近为例:当满足“issue/PR 处于 open 状态”且“新添加了area-AssemblyLoader、area-CodeGen-coreclr等某个area-*标签”时,进入一组if hasLabel: ...分支,对命中的每个 area 执行mentionUsers动作,例如(第 338-350 行):
- if: - hasLabel: label: area-AssemblyLoader then: - mentionUsers: mentionees: - agocke - elinor-fung replyTemplate: >- Tagging subscribers to this area: ${mentionees} See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed. assignMentionees: False这段配置印证了三个实现事实:
- 触发点是“标签被添加”事件(
labelAdded),即 6.1 中 issue-labeler 打完标签后,policy service 自动回复一条 “Tagging subscribers to this area: …” 并 @ 该区域在mentionees中配置的订阅者; assignMentionees: False:订阅者只会被 @ 提醒,而不会被自动指派(assign)为处理人——认领仍由人决定,这与文档“@ owners 而非强制指派”的精神一致;- 回复模板直接引导用户去阅读 area-owners.md 了解订阅方式,即文档与自动化配置互相引用、互为入口。
mentionees的具体名单就写在 resourceManagement.yml 中,而不是 md 表格中——这正是文档强调“编辑 md 不改变通知映射”的原因。
6.3 周期性清理任务:scheduledSearches
同一份配置里,scheduledSearches定义了每小时第 6 点运行的清理自动化(第 10-117 行),形成一条完整的 issue 生命周期治理链:
| 任务 | 过滤条件 | 动作 |
|---|---|---|
| Automated Issue cleanup | open、且 1644 天(约 4.5 年)无活动、未打过相关标签 | 回复提示 + 加backlog-cleanup-candidate、no-recent-activity标签,14 天后再无活动则关闭 |
| 标记 no-recent-activity(issues) | 带needs-author-action且 14 天无活动 | 加no-recent-activity标签并回复 |
| 标记 no-recent-activity(PRs) | 带needs-author-action且 14 天无活动 | 同上 |
| 关闭长期无活动 issue | 带no-recent-activity且再 14 天无活动 | 回复说明并closeIssue |
| 关闭长期无活动 PR | 同上 | 回复说明并closeIssue |
| 关闭 inactive Draft PR | Draft 状态且 30 天无活动 | 直接关闭并回复,回复中明确引导用户“想重新打开请查看 area-owners.md” |
可以看到,area-owners.md 不仅服务于“找谁”,也是自动化通知文案中面向用户的“重开 PR / 找负责人”指引文档,两份文件在治理流程中形成闭环。
6.4 与 CODEOWNERS 的互补:路径级评审 vs 标签级通知
标签驱动的通知解决“问题找谁”,而 .github/CODEOWNERS 解决“改动找谁评审”——PR 修改了哪些路径,就自动请求对应 owner 评审。从 CODEOWNERS 内容可以看到与 area 表相互呼应的映射:
| 路径 | 自动请求的评审者 | 对应 area(见 area-owners.md) |
|---|---|---|
/src/coreclr/jit/、/src/coreclr/inc/corinfo.h、corjit.h | @dotnet/jit-contrib | area-CodeGen-coreclr |
/src/coreclr/interpreter/ | @brzvlad @janvorli @kg | area-Codegen-Interpreter-coreclr |
/src/coreclr/nativeaot、/src/coreclr/tools/aot | @MichalStrehovsky、@dotnet/crossgen-contrib | area-NativeAOT-coreclr / area-ReadyToRun |
/src/mono | @steveisok @vitek-karas | area-Infrastructure-mono / 各 mono 区域 |
/src/mono/wasm、/src/mono/wasi、/src/mono/browser | @lewing @pavelsavara | os-wasi / os-browser |
/src/tools/illink/ | @sbomer | area-Tools-ILLink |
/docs/area-owners.* | @jeffhandley | area-Meta(文档本身的评审) |
/.github/policies/ | @jeffhandley @mkArtakMSFT | 自动化配置的评审 |
/.github/workflows/ | @jeffhandley @dotnet/runtime-infrastructure | area-Infrastructure |
从源码结构看,这套“标签通知 + 路径 CODEOWNERS”的双轨制覆盖了 issue 与 PR 的两个阶段:issue 阶段靠预测标签路由给区域专家,PR 阶段靠文件路径自动拉评审人,两者都以 area-owners.md 的分工表为语义基准。
七、社区成员如何订阅某个 area 的通知
这是本文最直接的实操指引,来自 area-owners.md 的 Notes 说明与 automation.md 的 Automation 文档,二者表述一致:
- 你不需要 commit 权限就能订阅某个 area 的通知;
- 订阅方式是提交一个 PR,编辑 resourceManagement.yml 中对应 area 的
mentionUsers.mentionees列表,把你自己加进去(automation.md 的 “Notifications” 一节原文即为:“To add or remove notifications for yourself, please offer a PR that edits the 'mentionees' value for that area in the policy YAML file”); - 合并后,该 area 的新 issue/PR 通知中就会出现你的 @,且
assignMentionees: False保证只提醒、不指派; - 注意:仅出现在 area-owners.md 表格里并不会收到通知,表格本身不是订阅配置(文档已明确提示)。
八、相关文件索引
| 文件 | 作用 |
|---|---|
| docs/area-owners.md | 本文主体:area / OS / arch 负责人表、标注约定、社区 triager 名单 |
| .github/policies/resourceManagement.yml | Policy Service 配置:area 标签触发订阅通知、周期性清理任务 |
| docs/infra/automation.md | Policy Service bot 的说明与社区订阅方式 |
| .github/CODEOWNERS | 路径级 PR 评审人自动请求规则 |
| .github/labeler-readme.md | issue-labeler 预测 workflow 的本地化配置说明(area-前缀、needs-area-label兜底、置信度阈值) |
| .github/workflows/labeler-predict-issues.yml、.github/workflows/labeler-predict-pulls.yml | 对 issue/PR 自动预测 area 标签的 workflow |
| .github/move.yml | issue 跨仓库迁移(move-issues)的行为配置,与路由体系配套 |
| docs/issues-pr-management.md | issue 与 PR 管理的更完整说明,可作延伸阅读 |
九、小结:三套机制如何协同
- 语义层:area-owners.md 定义“谁负责什么”——约 135 个
area-*区域、8 个 OS、4 个架构,外加 15 位社区 triager,构成人工路由的知识库; - 自动化层:issue-labeler 预测
area-*标签(低置信度回落到needs-area-label),resourceManagement.yml 中的 eventResponderTasks 在标签落定时自动 @ 订阅者(不自动指派),scheduledSearches 负责无活动 issue/PR 的标记、关闭与草稿清理; - 评审层:CODEOWNERS 按路径自动请求评审人,与 area 分工表互为印证。
理解了这套体系,你在参与 .NET 运行时项目时就能做到:提 issue 时 @ 正确的 owners 而非 lead;不确定归属时寻找 community triager;关心某个模块进展时用 PR 修改mentionees完成订阅;修改代码时知道哪些路径会自动拉哪些评审人。
【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考