如何确保我维护的 library/package 向后兼容?

How to ensure that the library/package that I'm maintaining is backward compatible?

我正在维护一个 library/package,它是通过包管理器(NuGet、Maven、NPM 等……没关系)分发的,而且我的新包有太多次不小心打破了向后兼容性。

例如,有一次我无意识地向方法添加了一个参数,却没有意识到它会破坏向后兼容性。

你如何确保你的包是向后兼容的?你有任何自动化测试吗?如果是这样,是什么类型的?还是您只依赖代码审查人员? .Net 的答案会很好,但也非常感谢任何语言的答案。

谢谢

Roslyn 团队创建了一个代码分析器来提供帮助。有instructions on GitHub on how to use it.

基本上您将 Microsoft.CodeAnalysis.PublicApiAnalyzers package 添加到您的项目中。如果您手动编辑您的项目 file/msbuild 文件,请务必将 PrivateAssets="all" 添加到 PackageReference,以避免此包成为您的包的依赖项并迫使您的包使用者通过以下方式使用分析器事故)。

然后,当您构建项目时,如果任何 public API 未在 PublicAPI.Shipped.txtPublicAPI.Unshipped.txt 文件中定义,分析器将报错。这有助于您检测何时有人添加了新的 API,因此代码审阅者可以决定支持人员是否应该支持 API。如果在代码中找不到在其中一个文本文件中定义的 API,则还有一条投诉规则。这告诉每个人 API 坏了。 There are some other analyzers/rules in the package,这有助于保持 APIs 稳定并提高 APIs 对包消费者的质量。

添加新的 API 时,有一个代码修复程序可以将新的 API 添加到 PublicAPI.Unshipped.txt 文件。您如何使用 PublicAPI.Unshipped.txtPublicAPI.Shipped.txt 取决于您,但我们的团队在将包发布到 nuget.org 后将所有内容从未发货转移到已发货。这意味着如果拉取请求删除或更改 PublicAPI.Unshipped.txt 中的 API,这不是重大更改,因为 nuget.org.[=23 上的包中从未提供 API =]

我的团队尚未围绕拉取请求中的 public API 更改实施任何自动化。但是,根据 CI 管道的复杂程度,您还可以针对 public API 更改执行更严格的策略。例如,使用 GitHub webhooks,您可以:

  • 当 PR 获得“PublicAPI:changed”标签时,使用 GitHub 检查 API 阻止 PR 被合并。如果标签被移除,则取消阻止 PR 被合并。
  • 当带有“PublicAPI:changed”标签的 PR 获得“PublicAPI:approved”标签时,使用 GitHub 检查取消阻止 PR 被合并。同样,如果移除了已批准的标签,但保留了已更改的标签,请再次阻止 PR 被合并。
  • 创建 PR 或添加新提交时,检查 PR 目标分支之间的差异,如果有任何 PublicAPI.[Unshipped|Shipped].txt 文件更改,则自动添加“Public Api:changed”标签。如果 PR 已经有“PublicAPI:changed”标签,但 PR 不再包含任何 PublicAPI.*.txt 更改,则删除“PublicAPI” :changed" 标签。
    • 推送新提交时是否删除“PublicAPI:approved”标签由您决定。这取决于 often/likely 拥有 PR 并获得 API 批准的人如何进行另一个 public API 更改并试图在没有另一个 public API 的情况下偷偷进行赞同。另一方面,如果 PR 需要与 public APIs 无关的小修复,请求某人再次批准 public APIs 可能会很烦人。

总之,这只是一个想法。到目前为止,当 PR 包含 public API txt 文件更改时,我们只是手动通知,并根据需要通知团队中的其他人进行审查。