贡献
欢迎所有人为 Swift 做出贡献。贡献不仅仅意味着提交拉取请求,还有许多不同的方式让您参与其中,包括在论坛上回答问题、报告或分类错误以及参与 Swift 演化过程。
无论您想以何种方式参与,我们都要求您首先阅读社区概览,了解参与该项目的任何人都应遵守的期望。如果您要贡献代码,您还应该了解如何从存储库构建和运行 Swift,如源代码中所述。
回答问题
支持社区最重要和最直接的方式之一是在论坛上回答问题。无论您是帮助新手理解语言功能,还是与经验丰富的开发人员一起解决极端情况,您对 Swift 的知识和经验都可以为他人提供很大帮助。
报告错误
报告错误是任何人帮助改进 Swift 的绝佳方式。开源 Swift 项目使用 GitHub Issues 来跟踪错误。
如果错误只能在 Xcode 项目或 Playground 中重现,或者错误与 Apple NDA 相关,请向 Apple 的错误报告器提交报告。
打开 issue 时,请包含以下信息
-
问题的简明描述。 如果问题是崩溃,请包含堆栈跟踪。否则,请描述您期望看到的行为以及您实际观察到的行为。
-
可重现的测试用例。 仔细检查您的测试用例是否重现了该问题。相对较小的示例(大约在 50 行代码以内)最好直接粘贴到描述中;较大的示例可以作为附件上传。考虑将示例简化为尽可能少的代码量——较小的测试用例更容易推理,并且对贡献者更具吸引力。
-
重现问题的环境描述。 包括有关 Swift 编译器版本、部署目标(如果已显式设置)和平台的信息。
由于 Swift 正在非常积极地开发中,我们收到了大量的错误报告。在打开新 issue 之前,请花一些时间浏览我们现有的 issue,以减少报告重复问题的可能性。
在提交 issue 请求新语言功能之前,请参阅Swift 演化过程部分。
分类错误
报告错误是改进软件的重要组成部分。几乎同样重要的是对这些错误进行分类,以确保它们是可重现的、小的和唯一的。
您可以通过多种方式来帮助分类错误跟踪器中的错误。
-
重现错误。为了使错误可操作,它需要是可重现的。如果您无法重现该错误,请尝试找出原因。如果您需要更多信息,请与提交者联系。
-
简化错误。一旦可以重现错误,请将其简化为尽可能少的代码量。推理一个仅用几行 Swift 代码即可重现错误的示例,比推理一个较长的示例更容易。
-
消除重复错误。如果两个错误报告都指向同一个根本问题,请将较新的一个标记为较旧的重复项。这样做可以让其他人更有效地工作。
网站和博客文章贡献
Swift 项目欢迎对本网站的建议和改进,以及社区博客文章的贡献,以展示整个社区的倡议和故事。Swift 网站工作组负责监督所有网站和博客文章的贡献。
在 网站治理流程中了解有关贡献本网站的更多信息,并了解如何提交博客文章贡献。
Swift 演化
塑造 Swift 的未来是社区共同努力的结果,任何人都可以通过 Swift 论坛的演化部分参与其中。Swift 演化过程涵盖了 Swift 语言和 Swift 标准库公共接口的所有更改,包括新的语言功能和 API、现有语言功能或 API 的更改、现有功能的删除等等。
请参阅Swift 演化审查计划,了解当前和即将进行的提案审查。
好的首个 Issue
好的首个 issue 是指旨在让 Swift 项目的新手贡献者,甚至是不熟悉 Swift 编译器等子项目背后的模式和概念的新手贡献者也能轻松上手的错误、想法和任务。好的首个 issue 会被标记上相应的标签,最容易通过访问 github.com/apple/<repository>/contribute
找到,例如主 Swift 存储库的 github.com/apple/swiftlang/contribute。它们预计是低优先级且范围适中的,不需要过多的重构、研究或调试——相反,它们应该鼓励新手涉足 Swift 的某些部分,更多地了解它,并做出真正的贡献。
任何具有提交权限并且对特定领域有见解的人都欢迎并鼓励找出或想出好的首个 issue。
贡献代码
开始使用
强烈建议您在自己的项目中熟悉 Swift 的使用,然后再直接为语言本身做出贡献。我们整理了方便的开始使用指南,其中包含分步说明,可帮助您启动并运行。
增量开发
Swift 项目使用小型的、增量的更改作为其首选的开发模型。有时这些更改是小的错误修复。有时,这些更改是朝着实现更大既定目标的小步骤。相比之下,长期开发分支可能会使社区在开发过程中失去发言权。长期分支的一些其他问题包括
- 如果分支开发和主线开发发生在相同的代码片段中,则解决合并冲突可能需要花费大量时间。
- 社区中的人们倾向于忽略分支上的工作。
- 非常大的更改难以进行代码审查。
- 分支不会由持续集成基础设施进行例行测试。
为了解决这些问题,Swift 使用增量开发风格。尽可能首选小的更改。我们要求贡献者在进行大的或其他侵入性更改时遵循此实践。以下是一些提示
-
大型或侵入性更改通常具有必须在大型更改之前进行的辅助更改(例如,API 清理或添加)。在主要更改之前提交这些更改,并且独立于该工作。
-
如果可能,将剩余的相互关联的工作分解为不相关的更改集。接下来,定义第一个增量并就更改的开发目标达成共识。
-
使集合中的每个更改要么独立存在(例如,修复错误),要么是为实现开发目标而计划的一系列更改的一部分。向社区解释这些关系可能会有所帮助。
如果您有兴趣进行大的更改并且不确定其总体效果,请务必首先通过开发者论坛讨论更改并达成共识。然后询问进行更改的最佳方法。
提交消息
虽然我们没有强制执行严格的提交消息格式,但我们建议您遵循以下准则,这些准则在开源项目中很常见。遵循这些准则有助于审查过程、搜索提交日志和电子邮件格式。从高层次上讲,提交消息的内容应该传达更改的基本原理,而无需深入了解太多细节。例如,“位设置不正确”会让审阅者想知道哪些位以及为什么它们“不正确”。相比之下,“正确计算 ‘Type’ 中的 ‘is dependent type’ 位”几乎传达了更改的所有内容。
以下是关于提交消息本身格式的一些准则
- 将提交消息分为单行标题和单独的正文,正文描述更改。
- 使标题简洁,以便在提交日志中轻松阅读并适合提交电子邮件的主题行。
- 在仅限于代码特定部分的更改中,在方括号中的行首包含 [标签] ——例如,“[stdlib] …”或“[SILGen] …”。此标签有助于电子邮件过滤器和提交后审查的搜索。
- 当有正文时,用空行将其与标题分隔开。
- 使正文简洁,同时包含完整的推理。除非理解更改是必需的,否则其他代码示例或其他详细信息应留给错误注释或邮件列表。
- 如果提交修复了错误跟踪系统中的问题,请在消息中包含指向该问题的链接。
- 对于文本格式和拼写,请遵循与文档和代码内注释相同的规则——例如,大写和句点的使用。
- 如果提交是对最近提交的另一个更改之上的错误修复,或者是补丁的还原或重新应用,请包含先前相关提交的 Git 修订号,例如“Revert abcdef because it caused bug#”。
对于轻微违反这些准则的情况,社区通常倾向于提醒贡献者此策略,而不是还原。可以通过回复提交邮件列表来处理小的更正和遗漏。
变更归属
当贡献者向 Swift 子项目提交更改后,在该更改获得批准后,其他具有提交权限的开发人员可以为作者提交更改。这样做时,保留贡献的正确归属非常重要。一般来说,Git 会自动处理归属。
我们不希望源代码中充斥着像“此代码由 J. Random Hacker 编写”这样的随机归属,这既嘈杂又分散注意力。请勿将贡献者姓名添加到源代码或文档中。
此外,除非其他人已将更改提交到项目,或者您已被授权代表他们提交更改(例如,您一起工作并且您的公司授权您贡献更改),否则请勿提交其他人创作的更改。作者应首先通过拉取请求将更改提交到相关项目、通过电子邮件发送到开发列表或添加错误跟踪器项。如果有人私下向您发送更改,请鼓励他们首先将其提交到相应的列表。
代码模板
正如 社区概览 中提到的, 代码的许可和版权保护在每个源代码文件的顶部标明。极少数情况下,您贡献的更改包含新的源文件,请确保正确填写文件头。
对于 Swift 源代码文件,代码头应如下所示
//===----------------------------------------------------------------------===//
//
// This source file is part of the open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swiftlang.cn/LICENSE.txt for license information
// See https://swiftlang.cn/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
对于 C 或 C++ 源代码或头文件,代码头应如下所示
//===-- subfolder/Filename.h - Very brief description -----------*- C++ -*-===//
//
// This source file is part of the open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swiftlang.cn/LICENSE.txt for license information
// See https://swiftlang.cn/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains stuff that I am describing here in the header and will
/// be sure to keep up to date.
///
//===----------------------------------------------------------------------===//
分隔线应精确到 80 个字符宽度,以帮助遵守代码风格指南。底部部分包含用于生成文档的可选描述(这些行以 ///
而不是 //
开头)。如果没有描述,则可以跳过此区域。
发布分支拉取请求
指向发布分支(release/x.y
或 swift/release/x.y
)的拉取请求,如果没有相应分支管理者的 GitHub 批准,则无法合并。为了使更改被考虑包含在发布分支中,拉取请求必须具有
-
标题以包含目标分支的发布版本号的标识开头。
-
在描述中填写了此表格。不适用的项目可以留空或用文字表明,但不得完全省略。
要在浏览器中在 swiftlang 仓库中起草拉取请求时切换到此模板,请将
template=release.md
查询参数附加到当前 URL 并刷新。例如-https://github.com/swiftlang/swift/compare/main...my-branch?quick_pull=1 +https://github.com/swiftlang/swift/compare/main...my-branch?quick_pull=1&template=release.md
这里是一个示例。
代码审查
Swift 项目在很大程度上依赖于代码审查来提高软件质量
- 所有重要的更改,无论开发者是谁,在提交到仓库之前都必须经过审查。较小的更改(或开发者拥有组件的更改)可以在提交后进行审查。
- 代码审查在 GitHub 上进行(通过拉取请求或提交的评论),并反映在相关项目的提交邮件列表中。
- 负责代码更改的开发者也负责进行所有必要的与审查相关的更改。
代码审查可能是一个迭代过程,持续到更改准备好提交为止。更改发送以供审查后,需要明确的批准才能提交。不要假设沉默即批准,也不要通过设定截止日期来要求主动反对补丁。
有时,代码审查会比您期望的要花费更长的时间,特别是对于较大的功能。以下是一些加速补丁审查时间的公认方法
- 审查他人的更改。 如果您伸出援手,每个人都会更愿意为您做同样的事情。善意是我们的货币。
- 将您的更改拆分成多个较小的更改。 您的更改越小,有人会快速查看它的可能性就越高。
- 提醒更改。 如果更改是紧急的,请提供理由说明为什么尽快合并此更改很重要,并每隔几天提醒一次。如果更改不紧急,通常的礼貌提醒频率为一周。请记住,您是在向其他专业开发人员索取宝贵的时间。
请注意,欢迎任何人审查更改并提供反馈,但只有拥有仓库提交权限的人员才能批准更改。
测试
开发者需要为修复的任何错误和添加的任何新功能创建测试用例,并将它们与更改一起贡献。
- 所有功能和回归测试用例都添加到相应的测试目录中——例如,
swift/test
目录。 - 在最接近实际功能的抽象级别编写测试用例。例如,如果是 Swift 语言功能,则用 Swift 编写;如果是 SIL 优化,则用 SIL 编写。
- 尽可能减少测试用例,特别是对于回归测试。将整个失败的程序放入
swift/test
是不可接受的,因为这会减慢所有开发人员的测试速度。请保持它们的简短。
质量
人们依赖 Swift 来创建他们的生产软件。这意味着 Swift 中的错误可能会导致成千上万甚至数百万开发人员的产品出现错误。因此,Swift 项目对质量保持着很高的标准。任何更改在提交到主开发分支之前都必须满足的最低质量标准包括
- 代码必须在至少一个平台上编译时没有错误或警告。
- 错误修复和新功能必须包含测试用例,以精确定位任何未来的回归,或者包括为什么测试用例不切实际的理由。
- 代码必须通过适当的测试套件——例如,Swift 编译器中的
swift/test
和swift/validation-test
测试套件。
此外,提交者有责任解决未来发现的任何由更改可能引起的问题。这种责任意味着您可能需要更新您的更改,以便
- 确保代码在所有主要平台上都能干净地编译。
- 修复在其他测试套件中发现的任何正确性回归。
- 修复任何主要的性能回归。
- 修复下游 Swift 工具中的任何性能或正确性回归。
- 修复导致使用 Swift 的客户代码出现任何性能或正确性回归。
- 解决错误跟踪器中因您的更改而出现的任何错误。
我们希望这些问题在提交之前得到处理,但我们理解不可能为每次提交都测试所有这些内容。我们的持续集成 (CI) 基础设施通常会发现这些问题。我们建议在接下来的一天中关注 CI 基础设施,以查找回归。如果包含您的提交的一组提交导致失败,CI 基础设施将直接通过电子邮件通知您。您需要检查这些消息以查看它们是否是您的错误,如果是,则修复损坏。
明显违反这些质量标准的提交可能会被回退,特别是当更改阻止其他开发人员取得进展时。开发者在问题修复后可以重新提交更改。
贡献者阶梯
此贡献者阶梯定义了您在 GitHub 上为 Swift 做出贡献时可能获得的 roles(角色)。每个角色都有相关的权限,这需要与贡献者社区建立信任。我们认识到 Swift 的贡献者有很多不同的类型,我们感谢每一位贡献者!每个参与过开源 Swift 项目的人都是贡献者:这可以通过编写代码、在论坛上回答问题、报告或分类错误或参与 Swift 演化过程来实现。
当您通过在 GitHub 上为 Swift 做出贡献而攀登贡献者阶梯时,您将获得新的权限,同时也获得您需要履行的信任和责任。如果贡献者违反了这种信任和这些责任,核心团队可能会向他们发出通知,并在多次违规后撤销其级别。我们相信一个健康的社区,并希望永远不需要采取这种行动。
成员
成员是对 Swift 做出多次建设性贡献的人。此角色在整个组织中通用,成为成员后,您可以在 GitHub 上 swiftlang 组织中的所有仓库上触发 CI。
- 要求
- 对 Swift 项目做出多次建设性贡献。这可以是 PR 的形式,参与 Swift 论坛,提交有价值的 issue,对其进行分类,或类似行为。
- 权限
- 触发 CI 测试的能力
- 在您的 GitHub 个人资料上显示您在 swiftlang 组织中的成员身份
- 提名
- 如果您想成为成员,请发送电子邮件至 代码所有者列表,其中包含您的贡献和您要使用的 GitHub 用户名
- 成长
- 表明您建设性地使用权限并继续贡献以获得提交权限。
提交访问权限
提交访问权限授予给有提交高质量更改记录的贡献者。如果您想要提交访问权限,请发送电子邮件至 代码所有者列表,其中包含您要使用的 GitHub 用户名以及 5 个非平凡拉取请求的列表,这些拉取请求在未经修改的情况下被接受。
获得提交访问权限后,您将能够提交到托管 项目的所有 GitHub 仓库。要验证您的提交访问权限是否有效,请进行测试提交(例如,更改注释或添加空行)。以下策略适用于具有提交访问权限的用户
-
您被授予对 Swift 所有部分的“批准后提交”权限。要获得批准,请创建拉取请求。当拉取请求获得批准后,您可以自行合并它。
-
您可以提交明显的更改,而无需事先获得批准。社区期望您运用良好的判断力。示例包括回退明显损坏的补丁、更正代码注释和其他细微更改。
-
您可以在未经批准的情况下,将更改提交到您贡献过或被分配负责的 Swift 部分。此类提交不得破坏构建。这是一种“信任但验证”的策略,此类提交将在提交后进行审查。
多次违反这些策略或一次性质恶劣的违规行为可能会导致提交访问权限被撤销。即使拥有提交访问权限,您的更改仍然需要接受代码审查。当然,也鼓励您审查他人的更改。
代码所有者
代码所有者是被分配到 Swift 项目特定领域的个人,代码质量是他们的首要责任。伞形 Swift 项目由众多子项目组成,包括 Swift 标准库、LLDB 调试器的扩展和 Swift 包管理器等等。每个子项目都将分配一个代码所有者。然后,代码所有者致力于审查所有贡献,收集社区的反馈,并将批准的补丁引导到产品中。
任何人都可以审查一段代码,我们欢迎所有感兴趣的人进行代码审查。代码审查程序不受中央全球策略的约束。相反,该过程由每个代码所有者定义。
任何活跃且表现出价值的社区成员都可以通过在论坛上发帖来申请成为代码所有者,或者由另一位成员提名。如果其他贡献者同意,项目负责人将进行任命并将新所有者的姓名添加到代码所有者文件中。该职位完全是自愿的,可以随时辞职。
当前代码所有者的列表可以在父 Swift 源代码树的根目录下的 CODE_OWNERS.txt
文件中找到。我们还维护一个邮件组,以便您可以发送电子邮件给所有代码所有者。
对于 Swift 的成功而言,可能没有什么比强大而积极参与的代码所有者更重要了。我们都应该对他们表示尊重、感激,并在力所能及的范围内提供帮助。
每位贡献者负责将自己的名字添加到项目根目录下的 CONTRIBUTORS.txt
文件,并维护联系信息。如果您以公司名义贡献,请添加贵公司的信息,请勿将您自己列为额外的版权所有者。