今天在 GitHub Trending 上看到一个老牌但常青的项目:microsoft/terminal,它是微软官方开源的 Windows Terminal、命令行控制台(conhost)以及相关组件的源码仓库,也是微软"拥抱开源"战略下最具代表性的作品之一。
一、项目概述
Windows Terminal 是微软为命令行用户打造的全新、现代、功能丰富的终端应用。长期以来,Windows 用户被困在古老的 conhost.exe(经典控制台)中,缺乏标签页、Unicode、emoji 等现代终端早已标配的能力。Windows Terminal 的诞生正是为了填补这一空白。
这个仓库实际上包含了多个紧密相关的项目:
- Windows Terminal:面向用户的现代终端应用(可从 Microsoft Store 安装)
- Windows Terminal Preview / Canary:预览版与每日构建的尝鲜版本
- Windows 控制台宿主
conhost.exe:Windows 原生的命令行基础设施,仓库中的代码就是 Windows 系统里conhost.exe的真实源码 - 共享组件:在两个项目间复用的文本渲染、缓冲区、VT 解析器等模块
- ColorTool 与示例项目:演示如何消费 Windows Console API
核心特性包括:多标签页、富文本、全球化(国际化)支持、高度可配置、主题与样式定制,同时还要满足微软对性能的严苛要求——快速、高效、不吞噬大量内存与电量。
值得注意:Windows Terminal 要求 Windows 10 2004(build 19041)或更高版本。
二、技术原理
从历史包袱到重构
要理解 Windows Terminal 的技术选型,必须先理解 conhost.exe 的困境。自 2014 年微软接手 Windows 命令行以来,团队为控制台增加了不少新能力:
- 背景透明
- 基于行的选择(line-based selection)
- ANSI / 虚拟终端序列支持
- 24 位真彩色
- 伪控制台 ConPTY
但由于控制台的首要目标是向后兼容,团队无法在其上添加标签页、Unicode 文本、emoji 等社区呼声很高的功能。这一根本矛盾催生了全新的 Windows Terminal。
共享组件的现代化
在重构 Windows Console 的过程中,团队对代码库进行了深度现代化改造:
- 将逻辑实体清晰地拆分为模块与类
- 引入关键扩展点
- 用更安全、更高效的 STL 容器替换老旧的自研集合与容器
- 借助微软的 Windows Implementation Libraries(WIL)让代码更简洁、更安全
这次改造让 Console 的若干核心组件得以在任意 Windows 终端实现中复用,包括:
- 基于 DirectWrite 的文本布局与渲染引擎
- 同时支持 UTF-16 与 UTF-8 的文本缓冲区
- VT 解析器/发射器(parser/emitter)
技术栈选型:为何坚持 C++
在规划新终端时,团队评估了多种技术栈,最终决定继续投资 C++ 代码库。理由很实际:这样可以在旧的 Console 和新的 Terminal 之间复用上述现代化组件;更进一步,团队意识到可以把 Terminal 的核心构建为可复用的 UI 控件,让其他应用也能集成终端能力。
ConPTY:连接的桥梁
一个容易被误解的点是 OpenConsole.exe——它其实就是本地构建的 conhost.exe。Windows Terminal 正是通过 ConPTY(伪控制台)与命令行程序连接和通信的。这套机制解耦了"终端前端"与"命令行后端",是现代 Windows 终端架构的关键。
三、安装与快速开始
环境要求
- Windows 10 2004(build 19041)或更高版本
Microsoft Store(推荐)
最省心的方式是直接从 Microsoft Store 安装,可随新版本自动升级。
通过 winget 安装
winget install --id Microsoft.WindowsTerminal -e
依赖支持需要 WinGet 1.6.2631 或更高版本;若要安装 1.18 及以上的稳定版,请确保 WinGet 客户端已更新。
通过 GitHub 手动安装
从仓库的 Releases 页面下载 Microsoft.WindowsTerminal_<versionNumber>.msixbundle,双击安装。若失败可在 PowerShell 中执行:
# 注意:PowerShell 7+ 请先运行
# Import-Module Appx -UseWindowsPowerShell
Add-AppxPackage Microsoft.WindowsTerminal_<versionNumber>.msixbundle
手动安装的版本不会自动更新,需要定期手动安装最新版本以获取修复与改进。
其他非官方渠道
Chocolatey:
choco install microsoft-windows-terminal
Scoop:
scoop bucket add extras
scoop install windows-terminal
尝鲜 Canary 版本
Windows Terminal Canary 是每日构建版本,包含 main 分支最新代码,可抢先体验新特性,但也是最不稳定的版本。它提供 App Installer 分发(支持自动更新,仅限 Windows 11)和便携 ZIP 分发(不自动更新,兼容 Windows 10 19041+ 与 Windows 11)。
四、构建、运行与调试
前置条件
若要从源码构建,需要:
- Windows 10 2004(build ≥ 10.0.19041.0)或更高版本
- 在 Windows 设置中启用开发者模式
- 安装 PowerShell 7 或更高版本
- 安装 Windows 11(10.0.26100)SDK,版本 ≥ 10.0.26100.8249
- 安装 VS 2026 版本 18.6 或更高
- 通过 VS Installer 安装工作负载:Desktop Development with C++ 和 WinUI application development
- 安装 .NET Framework 4.7.2 Targeting Pack 以构建测试项目
使用 WinGet 配置文件一键配置
克隆仓库后,可用 WinGet 配置文件自动搭建环境:
winget configure .config\configuration.winget
命令行构建
在 PowerShell 中:
Import-Module .\tools\OpenConsole.psm1
Set-MsBuildDevEnvironment
Invoke-OpenConsoleBuild
在 Cmd 中:
.\tools\razzle.cmd
bcz
运行与调试
在 Visual Studio 中调试时,右键 CascadiaPackage → 属性 → Debug 菜单,将"Application process"和"Background task process"都改为"Native Only",然后按 F5 构建并调试。
⚠️ 注意:必须选择 “x64” 或 “x86” 平台——Terminal 是 C++ 应用,无法在 “Any CPU” 下构建;也无法通过直接运行
WindowsTerminal.exe启动。
五、常见问题与解决方案
Q1:我构建并运行了新 Terminal,但它看起来和旧控制台一模一样?
原因是你在 Visual Studio 中启动了错误的解决方案。解决方法:确保构建并部署的是 CascadiaPackage 项目。
Q2:手动安装后提示缺少框架包?
在较老的 Windows 10 版本上,可能需要安装 VC++ v14 桌面框架包。
Q3:为什么不能直接运行 WindowsTerminal.exe?
这是设计使然,详见 issue #926 与 #4043。Terminal 依赖打包部署的机制运行。
Q4:winget 安装失败或版本不对?
确保 WinGet 客户端已更新到 1.6.2631 或更高,否则无法正确处理依赖。
六、总结
Windows Terminal 不仅是一个终端应用,更是微软对自身命令行生态一次彻底的现代化重塑。它巧妙地在"向后兼容的老 conhost"与"面向未来的新终端"之间架起桥梁:一方面通过 ConPTY 保持与既有命令行程序的兼容,另一方面借助 DirectWrite 渲染引擎、双编码文本缓冲区与可复用 UI 控件带来标签页、Unicode、真彩色等现代体验。
对开发者而言,这个仓库既是学习大型 C++ 项目工程化(WIL、STL、模块化拆分)的绝佳范本,也是理解 Windows 命令行底层机制的一手资料。如果你是 Windows 上的命令行重度用户,Windows Terminal 早已是不可或缺的生产力工具;如果你是系统级开发者,它的源码同样值得细读。