扩展和生态系统支持

Visual Studio Live Share 的主要目标之一是使开发人员能够使用他们喜爱的和高度自定义的工具来轻松地相互协作。 这样便可以频繁地进行临时交互,同时保持视觉上的熟悉感并符合人体工程学,无论提供哪方面的帮助时都是如此。 为实现此目的,协作会话内的参与者务必能够继续使用支持其个人偏好设置和工作流(例如颜色/图标主题、键绑定、编辑器工作效率提升工具)的任何扩展。

此外,为了尽可能实现实时加入协作会话并同时保持高效,Visual Studio Live Share 的目标是使来宾能够自动利用其主机共享的特定于项目的工具。 这样,你只需单击一个链接,启动所选工具,然后开始协作,无需任何额外设置。 为实现此目的,为核心编辑、构建和调试工作流程提供支持的扩展务必透明地从主机“远程”到来宾,以便自动完成、转到定义和调试等功能能够正常工作。

本文档介绍了大规模扩展生态系统的当前已知状态,以及针对上述目标的“记分卡”。 如果遇到不符合此条件的扩展并且该扩展对个人工作流至关重要,请告诉我们!

特定于用户的扩展

支持特定于用户的自定义的扩展必须适用于主机,并且适用于所有来宾。 如果某个扩展在主机上不能正常工作,这是一种回归,并且很可能是 Visual Studio Live Share 中的 bug(如果遇到此情况,请提交问题!)。 如果某个扩展未在来宾使用时按预期方式工作,则可能需要更改扩展本身,我们将与生态系统合作来处理/改进这些方案。

Visual Studio Code

类别 示例 支持来宾? 协作?
颜色主题 One Dark Pro、Output Colorizer、Rainbow String、Colored Regions、Indented Block Highlighting、Todo Highlight、Bracket Pair Colorizer ✅ 空值
图标集 vscode-icons、Visual Studio Classic Icons ✅ 空值
键绑定 Vim、IntelliJ IDEA Keybindings、Emacs Friendly Keymap ✅ 空值
代码片段 Angular v5 Snippets、HTML Snippets、SVG Icons、File Header ✅ 空值 1
组织 Settings Sync、Project Manager、Timeit、Checkpoints、TODO Parser、Favorites (❌)、Bookmarks (❌) ✅2 空值 3
工作效率 GitLens、Auto-Rename Tag、Code Outline、Color Highlight、Increment Selection、Bracketeer、Image Preview、JSON Helper (Hover)、Color Picker、Copy Word in Cursor、CodeMetrics (CodeLens)、Git Co-Authors、JavaScript Booster (CodeActions)、Turbo Console Log、Goto Next/Previous Member、Auto-scroll、NPM Import Version (❌)、Import Cost (❌) ✅2 ❌3
REPL REST Client、Code Runner、Quokka.js、R ✅4 ❌3
资源管理器 mssql、ftp-simple、Azure Functions、Docker、Brew Services ✅5 ❌3

1 除非用户已熟悉代码片段,否则将无法使用它,因此共享代码片段不一定有意义。

2 这些扩展类别非常多样,因此不可能全部都可使用。但理论上,它们应该全部都可使用,我们会跟踪不可使用的键。

3 这些扩展类别可能会受益于协作体验,因此我们需要最终用户反馈来了解相关情况!

4 这些内容需要来宾安装运行时工具(例如 Node.js),并通过在本地运行代码来工作。

5 这些内容通过连接到某种类型的服务器来工作,并且可以与集中式服务器或来宾共享的服务器一起使用。

特定于项目的扩展

主机安装的扩展(支持对应用程序进行核心编辑、构建和调试并且特定于语言/平台/库/SDK)应该自动提供给来宾,无需来宾安装任何内容。 这样主机便可以设置其环境,以支持高效的项目开发并允许其来宾即时加入这些项目,而无需额外的先决条件。 由于特定于项目的扩展不会以任何方式进行主观化或个性化,因此,所以它们可以确定地进行从主机到来宾的共享,而不会影响任何人熟悉的环境。

此外,为了支持来宾已安装、但主机未提供的特定于项目的扩展,理想情况下会提供降级但功能正常的体验(例如,获取单个文件 intellisense、能够格式化文档)。

类别 示例 共享? 支持来宾?
语法突出显示 Fish Shell、Nginx、Vetur、DotEnv、ES6 String HTML、Todo+、Rainbow CSV ❌ ✅
语言服务 YAML、Path Intellisense、ARM ✅1 ✅2
JSON 架构 Azure Functions ✅ ✅
Linter ESLint、Markdownlint、Code Spell Checker、PHPCS ✅ ✅2
格式化程序 Prettier、Beautify ✅ ✅2
调试器 Python、Debugger for Chrome ✅3 ❌4
测试运行程序 Java Test Runner、Mocha Sidebar、Jest Runner、Neptune ❌5 ✅2
自定义文件预览程序 SVG Preview、GraphViz、Markdown Image Size ❌ ✅
文件/项目生成器 Azure Functions、C/C++ Project Generator ❌ ❌6
源代码管理提供程序 SVN、Hg ❌ ❌

1 目前仅限 C# 和 JavaScript/TypeScript。

2 仅支持最新活动文档,因为来宾没有本地文件访问权限。

3 核心调试体验是共享的,但不会自动转发任何已启动的服务器。

4 来宾没有应用的本地副本,因此,运行中的应用和任何调试会话都需要在主机的计算机上启动。

5 测试运行的输出需要同时与来宾共享生成的任何终端、输出窗格和错误。

6 几乎所有这些内容都直接使用 Node.js fs模块来创建文件,但此做法不可行。

已知问题

以下是当前已知的扩展问题,这些问题可能使这些扩展(及其解决方法)无法供协作会话上下文中的来宾使用,因此可能会影响其工作流:

Visual Studio Code

问题 原因 解决方法
使用 Node.js fs 模块来检测/读取文件(例如配置文件)或枚举目录(并且不是语言服务)。 来宾没有本地文件访问权限。 1. 温和地降级客户体验(如果可能)。

2. 使用 openTextDocument 和 findFiles 工作区 API 来读取和枚举文件。
使用 Node.js fs 模块创建或写入文件 同上 N/A 可以使用 openTextDocument(Uri) API 创建 untitled 文件,但不能将其直接保存到文件系统中的特定路径。
依赖于项目捆绑的库或工具 同上 1. 将依赖项的回退版本与扩展捆绑在一起

2. 如果来宾选择显式安装,则支持全局安装以取消阻止来宾。

3. 远程处理状态/操作(如果可能),因为主机具有可用的正确依赖项。
使用 Node.js fs 模块创建目录 同上 空值
将功能限制为使用 file 方案的文档。 来宾端的文件使用 vsls 方案。 添加对 vsls 文档的支持(示例)
使用 Uri.file 方法和/或 Uri.fsPath/TextDocument.fileName 成员来序列化/分析 URI 同上 改为使用 Uri.parse 和 Url.toString(),以维护和遵守文件方案(示例)
将 workspace.openTextDocument 方法与文件路径(而不是 Uri)一起使用 同上 提供 Uri 实例,而不是原始文件路径字符串(示例)
使用 workspace.rootPath 属性检测是否存在工作区 workspace.rootPath 属性对 workspace 中的第一个 workspaceFolder 调用 Uri.fsPath,这会出现与上述相同的问题 请改为使用 workspace.workspaceFolders 属性来检测是否存在工作区,如果需要,请查看每个 workspaceFolder 的 Uri.scheme 以确定它是否在本地
注册语言服务时(通过 LanguageClient 或 languages.register* 方法)未指定文档方案 来宾会收到来自其本地扩展和主机的语言服务结果,因此,如果两个参与者都安装了相同的语言服务扩展,来宾将看到某些内容(例如自动完成、代码操作)的重复条目 将语言服务限制为仅适用于 file 和 untitled 方案(示例)
在填充文档的 DiagnosticCollection 之前不检查文档的 Uri.scheme 同上 仅为 Uri.scheme === file 的 documents 生成 Diagnostics(示例)
从自定义 TaskProvider 返回 Tasks 时不检查工作区方案 来宾显示所有远程和本地任务,因此,如果两个参与者都安装了同一扩展,则会显示重复项 仅为 Uri.scheme === file 的 WorkspaceFolder 返回 Tasks(示例)

另请参阅

遇到问题? 请参阅疑难解答或提供反馈。