参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

首次体验丰富的代码导航

2018年12月4日 Jonathan Carter, @lostintangent

拉取请求是数百万开发者日常使用的关键协作工具,它促进了异步代码审查以及团队和开源社区之间的知识传播。由于其广泛的实用性和普及性,PR 审查工作流程的任何改进都可能对开发人员的生产力、产品质量和发布速度产生重大影响。

9月,我们与 GitHub 共同发布了 GitHub Pull Requests 扩展,它使开发人员能够在他们编写代码的同一个地方进行源代码审查:在他们熟悉且高度定制的编辑器中。今天,我们很高兴能分享一个新体验的预览,它将通过支持丰富的、多仓库代码导航,进一步增强编辑器内的 PR 审查。

告别肤浅的审查

要彻底审查一个拉取请求,你需要理解其变更的上下文以及它们如何影响更广泛的代码库。如今,许多开发者在浏览器中进行“轻量级审查”,这提供了一个极其便捷的工作流程,但也容易错过很多必要的上下文(例如,“这个变更会破坏 API 的任何消费者吗?”)。GitHub Pull Requests 扩展通过允许你利用开发环境的功能来构建和导航正在审查的源代码,从而改进了这种体验,但仍然要求你在本地检出分支,并安装必要的平台 SDK 和语言扩展。对每个 PR 都这样做可能需要大量的时间和上下文切换,这让你面临在快速审查远程 PR 的便利性,或在本地编辑器中审查它们的强大功能之间做出选择。我们认为开发者应该两者兼得

我们正在构建的丰富代码导航体验帮助开发者在开发环境中(通过 Visual StudioVisual Studio Code 扩展)跟踪他们感兴趣的拉取请求,并随时开始无缝导航远程托管 PR 中的变更,而无需在本地检出这些主题分支。具体来说,它增强了你从GitHub Pull Requests视图打开的文件,使其具有驱动其他编辑器体验的相同代码导航功能(例如悬停信息、转到定义、查找所有引用),但在这种情况下,完全由云端提供支持。我们相信这可以提高团队的生产力,并使肤浅的审查成为过去。

Navigating a csharp PR

在 macOS 上导航基于 C# 的 PR,甚至无需安装 C# 扩展或 .NET。

Navigating a C++ PR

在 macOS 上导航基于 C++ 的 PR,甚至无需安装 C++ 扩展。

Navigating a Java PR

在 macOS 上导航基于 Java 的 PR,甚至无需安装 Java 语言支持 (redhat.java) 扩展。

导航所有内容

通过此体验,你可以导航到在你正在审查的文件中定义的符号(例如类、函数、属性),在作为 PR 一部分而更改的其他文件中定义的符号,以及在同一仓库中任意文件中定义的符号。通过这种方式,你理解整个代码库中变更的能力不受 PR 范围或本地环境的限制。

此外,如果你正在审查的 PR 使用了外部仓库中的依赖项,或包含了被外部仓库中的代码使用的 API,你也可以直接导航到这些源!通过这种方式,你可以完全——更重要的是,快速地——评估变更的影响,无论你的应用程序在版本控制中是如何组织的。我们相信这是一个极其强大的功能,特别是随着越来越多的团队正在构建多仓库应用程序/微服务并严重依赖 OSS。

Navigating into a Mobx repo

从对 observable 函数的外部引用,直接导航到 GitHub 上的 MobX 仓库

以社区为中心的设计

在幕后,此体验由 语言服务器协议 (LSP) 的一项附加功能提供支持,LSP 已经是许多 工具(例如 Visual Studio 和 Visual Studio Code)的语言支持基础。这项提案称为语言服务器索引格式 (LSIF,发音像“else if”),它为语言服务器提供了一种持久化其运行时智能的方式,以便后续可以大规模地用于回答 LSP 请求(例如悬停和转到定义)。此外,LSIF 定义的数据模型允许通过丰富的源代码图以及代码与外部仓库的关系来表示仓库。

作为构建这项服务的一部分,我们已经开始为各种语言(TypeScriptJava、C++ 和 C#)实现 LSIF 支持,我们对迄今为止的结果感到非常兴奋。然而,为了使这项工作取得成功,与社区在标准以及额外的语言实现方面进行合作至关重要。要了解更多关于 LSIF 的信息,并为未来的讨论做出贡献,请查阅LSIF 规范草案

我们需要您的反馈!

我们很高兴能首次展示丰富的代码导航体验!在您可以实际体验到这项功能之前,我们还有很多工作要做,但我们希望与社区就我们正在进行的工作展开公开对话。如果您有兴趣与我们的团队交流并参与潜在的预览,您可以在此处注册。我们期待在不久的将来分享更多更新!

愉快地审查!

Jonathan, @lostintangent