<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Winget on 我的博客</title><link>https://blog.5616760.com/tags/winget/</link><description>Recent content in Winget on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 02 Oct 2026 11:30:00 +0800</lastBuildDate><atom:link href="https://blog.5616760.com/tags/winget/index.xml" rel="self" type="application/rss+xml"/><item><title>微软官方的 Windows 装机脚本：一条命令重装你的开发机</title><link>https://blog.5616760.com/0028.html</link><pubDate>Fri, 02 Oct 2026 11:30:00 +0800</pubDate><guid>https://blog.5616760.com/0028.html</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文整理自 GitHub 项目 &lt;a class="link" href="https://github.com/microsoft/WindowsDeveloperConfig" target="_blank" rel="noopener"&#10; &gt;microsoft/WindowsDeveloperConfig&lt;/a&gt;（MIT 许可）的 README、&lt;code&gt;src/windows-dev-config/README.md&lt;/code&gt;、&lt;code&gt;wsl-comfort/readme.md&lt;/code&gt;、&lt;code&gt;src/docs/development.md&lt;/code&gt; 与部分 &lt;code&gt;configuration.winget&lt;/code&gt; 源码。命令、注册表路径、配置清单忠于原文；章节组织、选型建议与评述为本文编辑归纳。数据截至 2026-10-02（仓库 2.9k star / 200 fork，创建于 2026-05-21）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;新到手的 Windows 11 开发机，从开机到能跑起来 hello world，中间隔着一段没人愿意承认的时间：装 Git、装 Node、装 Python、装 VS Code，改主题、改资源管理器不显示文件扩展名、改长路径、开 WSL，然后再发现 Oh My Posh 的字体没配好，终端里全是方块。&lt;/p&gt;&#10;&lt;p&gt;微软把这个流程做成了官方仓库：&lt;strong&gt;&lt;code&gt;microsoft/WindowsDeveloperConfig&lt;/code&gt;&lt;/strong&gt;，标语是三句话 —— &lt;em&gt;Opinionated setups for Windows dev boxes. Idempotent. CI-tested.&lt;/em&gt;（有主张的 Windows 开发机配置；幂等；CI 验证过）。&lt;/p&gt;&#10;&lt;p&gt;它解决的是一个很具体的痛点：&lt;strong&gt;你的开发环境应该帮你交付，而不是变成另一个需要调试的项目。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一先选路线三条岔路别走错"&gt;一、先选路线：三条岔路，别走错&#10;&lt;/h2&gt;&lt;p&gt;这个仓库不是单一脚本，而是三套互相独立的配置方案。走错路线会浪费不少时间，所以先看这张图：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; S["一台 Windows 11 机器"] --&gt; Q1{"你想要什么？"}&#10;&#10; Q1 --&gt;|"整套开发工作站&lt;br/&gt;工具+系统设置+WSL+终端&lt;br/&gt;一次装完，重启一次"| A["🖥️ Windows Dev Config&lt;br/&gt;一行命令&lt;br/&gt;无需 git clone"]&#10; Q1 --&gt;|"只要一个好用的 Shell&lt;br/&gt;zsh + Starship + 现代 CLI&lt;br/&gt;可逐项勾选"| B["🐧 WSL Comfort&lt;br/&gt;交互/无人值守都支持"]&#10; Q1 --&gt;|"只要某一门语言&lt;br/&gt;Node/Python/Go/Rust/Java…"| C["🧪 Single-language Workloads&lt;br/&gt;12 个可选"]&#10;&#10; A --&gt; A1["Standard&lt;br/&gt;够用、克制"]&#10; A --&gt; A2["Full&lt;br/&gt;开发者模式/远程桌面/Edge 策略"]&#10;&#10; style A fill:#2d6cdf,stroke:#1c4a9e,color:#fff&#10; style B fill:#8a6d3b,stroke:#5f4a25,color:#fff&#10; style C fill:#3b7a57,stroke:#265239,color:#fff&#10; style A2 fill:#a33,stroke:#711,color:#fff&lt;/pre&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;路线&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;入口命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;需要克隆仓库吗&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;重启吗&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Windows Dev Config&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;irm https://aka.ms/devconfig/standard/setup.ps1 | iex&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;会，一次&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WSL Comfort&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.\wsl-comfort\install.ps1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;首次装 WSL 时会&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单语言 Workloads&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.\Workloads\python\install.ps1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不会&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;一个容易混淆的点：&lt;strong&gt;Windows Dev Config 和 WinUI 3 这两条路线不需要 &lt;code&gt;winget configure&lt;/code&gt;&lt;/strong&gt;（用自己的引擎），其余 Workloads 依赖 &lt;code&gt;winget configure&lt;/code&gt;，需要先启用。后面第五节会讲启用时的坑。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二路线一windows-dev-config--一行命令一次重启"&gt;二、路线一：Windows Dev Config —— 一行命令，一次重启&#10;&lt;/h2&gt;&lt;p&gt;打开任意一个 PowerShell 窗口，&lt;strong&gt;提权或不提权都行&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 标准版&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;irm https&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;//aka.ms/devconfig/standard/setup.ps1 | iex&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 完整版&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;irm https&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;//aka.ms/devconfig/full/setup.ps1 | iex&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ &lt;strong&gt;它会重启你的机器，一次。&lt;/strong&gt; 启用 WSL 需要装一个 Windows 可选功能，而那个必须重启。脚本会给 10 秒警告，然后注册一个计划任务，你重新登录并接受 UAC 之后自动接着装。&lt;strong&gt;跑之前先保存工作。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="21-standard-装什么"&gt;2.1 Standard 装什么&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;开发工具&lt;/strong&gt;：Windows Terminal、PowerShell 7、Git、GitHub CLI、GitHub Copilot CLI、VS Code、.NET SDK 10、Python 3.14 + uv、Node.js LTS + nvm、Coreutils for Windows、Windows App CLI、Oh My Posh、PowerToys。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;终端&lt;/strong&gt;：PowerShell 7 设为默认 profile、Oh My Posh 进提示符、Cascadia Mono NF 作默认字体、下拉菜单里多一个 GitHub Copilot profile。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Windows 设置&lt;/strong&gt;：深色主题、Win32 长路径、文件资源管理器默认值、开始/搜索设置、勿扰模式。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;WSL&lt;/strong&gt;：WSL 平台 + Ubuntu，含重启与之后的自动续跑。&lt;/p&gt;&#10;&lt;h3 id="22-full-多加了什么"&gt;2.2 Full 多加了什么&#10;&lt;/h3&gt;&lt;p&gt;在 Standard 全部内容之上，追加：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Windows 设置&lt;/strong&gt;：开发者模式、Sudo（inline 模式）、关闭 Widgets、Edge 策略、更多开始/搜索/系统托盘设置。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远程桌面&lt;/strong&gt;：启用 + 配好防火墙规则。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="23-它到底改了哪些注册表"&gt;2.3 它到底改了哪些注册表&#10;&lt;/h3&gt;&lt;p&gt;这是整套东西里最需要提前知道的部分。官方 &lt;code&gt;windows-dev-config/README.md&lt;/code&gt; 给了完整清单，节选最有辨识度的几项：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;分类&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;配置项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;注册表路径&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Standard&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Sudo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKLM\…\Windows\CurrentVersion\Sudo\Enabled&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开发者模式&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKLM\…\AppModelUnlock\AllowDevelopmentWithoutDevLicense&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Win32 长路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远程桌面&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKLM\…\Control\Terminal Server\fDenyTSConnections&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;显示文件扩展名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\Advanced\HideFileExt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;显示隐藏文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\Advanced\Hidden&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;标题栏完整路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\CabinetState\FullPath&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;打开&amp;quot;此电脑&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\Advanced\LaunchTo&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;任务栏&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;右键&amp;quot;结束任务&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\Advanced\TaskbarDeveloperSettings\TaskbarEndTask&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开始菜单&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;无推荐项&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Explorer\Advanced\Start_IrisRecommendations&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通知&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;全局勿扰&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Notifications\Settings\NOC_GLOBAL_SETTING_TOASTS_ENABLED&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Edge&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新标签页空白&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKLM\SOFTWARE\Policies\Microsoft\Edge\NewTabPageLocation&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;about:blank&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主题&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应用/系统深色&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;HKCU\…\Themes\Personalize\AppsUseLightTheme&lt;/code&gt; / &lt;code&gt;SystemUsesLightTheme&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;WinForms / WinUI 3 的提醒&lt;/strong&gt;：这两条会拉几个 GB 的 Visual Studio 组件。真机上没问题，小虚拟机上会很痛苦。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="24-重启之后到底发生了什么"&gt;2.4 重启之后到底发生了什么&#10;&lt;/h3&gt;&lt;p&gt;这是我觉得整个设计里最值得说的一段。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;dev-config.ps1&lt;/code&gt; 把安装拆成 &lt;strong&gt;11 个阶段&lt;/strong&gt;，Full 全跑，Standard 跳过 Edge 阶段：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;#&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;阶段&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Getting ready&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;确认 PowerShell 7，必要时把 winget 更新到锁定稳定版&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Packages&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;装全部包 + PowerToys 通知设置&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;System settings&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Sudo、开发者模式、长路径、远程桌面&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;File Explorer tweaks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器注册表项&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Taskbar, search &amp;amp; start&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;任务栏/搜索/开始菜单/通知&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Microsoft Edge tweaks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Edge 策略（Standard 跳过）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Fonts&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Cascadia Code NF / Mono NF，SHA-256 校验&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Windows Terminal&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;默认 profile、字体、RunOnce 字体更新&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PowerShell profile&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Oh My Posh 配置&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub Copilot&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;终端 profile、WinUI 模板、Copilot CLI 插件（best-effort）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WSL + Ubuntu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;故意放最后&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;第 11 阶段放在最后是有道理的：&lt;strong&gt;唯一需要的那次重启被推迟到其它所有事都干完之后&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram&#10; participant Y as 你&#10; participant B as bootstrap.ps1&#10; participant D as dev-config.ps1&#10; participant T as 计划任务&#10;&#10; Y-&gt;&gt;B: irm ... | iex&#10; B-&gt;&gt;B: 请求 UAC → 校验 Microsoft 签名&#10; B-&gt;&gt;D: 释放到 %ProgramData%\CalmOS&#10; D-&gt;&gt;D: Phase 1-10（Check → Apply → Verify）&#10; D-&gt;&gt;D: 写 devconfig-tally.json&#10; D-&gt;&gt;T: 注册 WindowsDevConfigResume&#10; D-&gt;&gt;Y: ⚠️ 10 秒倒计时后重启&#10; Y-&gt;&gt;T: 重新登录（约 30 秒后）&#10; T-&gt;&gt;D: 以你自己的身份恢复执行&#10; D-&gt;&gt;D: Phase 11：WSL + Ubuntu&#10; D-&gt;&gt;Y: 合并后的总结，并移除任务&lt;/pre&gt;&lt;p&gt;要点：&lt;strong&gt;只重启一次&lt;/strong&gt;。若 WSL 仍不可用，会停下说明原因，不会陷入循环重启。&lt;/p&gt;&#10;&lt;h3 id="25-幂等是怎么做出来的"&gt;2.5 幂等是怎么做出来的&#10;&lt;/h3&gt;&lt;p&gt;官方文档原话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;It is &lt;strong&gt;idempotent&lt;/strong&gt; — every change is checked before it&amp;rsquo;s made, so re-running it only fixes what has drifted. It is also &lt;strong&gt;resumable&lt;/strong&gt; — if it fails, or you close the window, running it again picks up where it left off.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;机制是每个 step 走 &lt;strong&gt;Check → Apply → Verify&lt;/strong&gt; 三步：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Check&lt;/strong&gt;：先看是不是已经在目标状态。是 → 打印 &lt;code&gt;already OK&lt;/code&gt;，什么都不做。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Apply&lt;/strong&gt;：不在，才改。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Verify&lt;/strong&gt;：再跑一遍同一个 check。&lt;strong&gt;仍失败就是 error&lt;/strong&gt;，不是&amp;quot;静默成功&amp;quot;。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;标记为 &lt;strong&gt;best-effort&lt;/strong&gt; 的步骤失败时记为 &lt;code&gt;flagged&lt;/code&gt;，流程继续，最后在总结里点名。进度记在 &lt;strong&gt;&lt;code&gt;devconfig-tally.json&lt;/code&gt;&lt;/strong&gt; 里，所以重启之后（或直接重跑）已成功的步骤几秒内就跳过，只重试 flagged 的。&lt;/p&gt;&#10;&lt;p&gt;包只有在 winget 报告 &lt;strong&gt;installed 且 current&lt;/strong&gt; 时才算完成 —— 所以重跑顺带会把可用更新拉下来。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三路线二wsl-comfort--把-shell-弄舒服"&gt;三、路线二：WSL Comfort —— 把 Shell 弄舒服&#10;&lt;/h2&gt;&lt;p&gt;也叫 Comfort Shell。它是&lt;strong&gt;两半结构&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;脚本&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;跑在哪&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;install.ps1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Windows（PS 5.1 或 7）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编排：确保 WSL、挑/装发行版、在发行版里调 bootstrap、装字体、投放 WT profile&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;comfort-shell-bootstrap.sh&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ubuntu（WSL 或裸机）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;配置 shell、提示符、工具、shims、Homebrew、git 默认值、dotfiles&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;关键一句：&lt;strong&gt;bootstrap 是独立的&lt;/strong&gt;。你可以把它 scp 到任何 Ubuntu 主机上单独跑，&lt;code&gt;install.ps1&lt;/code&gt; 只是薄薄的编排层。灵感来自 &lt;a class="link" href="https://github.com/shanselman/MacLikeWSLComfortShell" target="_blank" rel="noopener"&#10; &gt;Scott Hanselman 的 MacLikeWSLComfortShell&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h3 id="31-五种用法"&gt;3.1 五种用法&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\wsl-comfort\install.ps1 &lt;span style="color:#75715e"&gt;# 交互式，逐步确认&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\wsl-comfort\install.ps1 -NonInteractive &lt;span style="color:#75715e"&gt;# 无人值守，默认 Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\wsl-comfort\install.ps1 -Distro Ubuntu-&lt;span style="color:#ae81ff"&gt;24.04&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 指定已有发行版&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\wsl-comfort\install.ps1 -BootstrapArgs &lt;span style="color:#e6db74"&gt;&amp;#39;--shell=bash&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;--no-brew&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./comfort-shell-bootstrap.sh &lt;span style="color:#75715e"&gt;# 交互&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./comfort-shell-bootstrap.sh --non-interactive &lt;span style="color:#75715e"&gt;# 默认，不提问&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./comfort-shell-bootstrap.sh --dry-run &lt;span style="color:#75715e"&gt;# 只看不改&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-bootstrap-的开关"&gt;3.2 bootstrap 的开关&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Flag&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--shell=zsh|bash&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;默认 shell，默认 zsh&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--no-brew&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过 Homebrew&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--no-shims&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过 &lt;code&gt;pbcopy&lt;/code&gt;/&lt;code&gt;pbpaste&lt;/code&gt;/&lt;code&gt;open&lt;/code&gt;/&lt;code&gt;xdg-open&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--no-prompt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过 starship&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--no-tools&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跳过 apt CLI 工具&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--minimal&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;等于 &lt;code&gt;--no-brew --no-shims --no-tools&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;覆盖已有配置，而不是保留&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--dry-run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;预演&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="33-三个我觉得很见功力的细节"&gt;3.3 三个我觉得很见功力的细节&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;① 托管块（managed blocks）写 dotfiles。&lt;/strong&gt; 它在 &lt;code&gt;~/.zshrc&lt;/code&gt; 里写的是 &lt;code&gt;# &amp;gt;&amp;gt;&amp;gt; comfort-shell &amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; / &lt;code&gt;# &amp;lt;&amp;lt;&amp;lt; comfort-shell &amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; 包起来的一段，重跑时整块替换，不踩用户自己的编辑。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;② 每发行版一个确定性 GUID。&lt;/strong&gt; Windows Terminal fragment 的 GUID 取 &lt;code&gt;MD5(&amp;quot;comfort-shell:&amp;lt;distro&amp;gt;&amp;quot;)&lt;/code&gt;。效果：重跑原地更新；Ubuntu 和 Ubuntu-24.04 能作为两个 profile 共存。Fragment 落在&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;%LOCALAPPDATA%\Microsoft\Windows Terminal\Fragments\ComfortShell\comfort-shell-&amp;lt;slug&amp;gt;.fragment.json&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后&lt;strong&gt;碰一下 &lt;code&gt;settings.json&lt;/code&gt; 的 mtime&lt;/strong&gt;，WT 就会热重载扫描，不用重启终端。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;③ 调完 &lt;code&gt;wsl.exe&lt;/code&gt; 必须 &lt;code&gt;Reset-TerminalInputMode&lt;/code&gt;。&lt;/strong&gt; &lt;code&gt;wsl.exe&lt;/code&gt; 会给父控制台打开 Win32 Input Mode 和焦点报告，而且不总是还原。不复位，后面 &lt;code&gt;Read-Host&lt;/code&gt; 会吐出 &lt;code&gt;^[[I&lt;/code&gt; 这类转义序列。这种坑不自己踩过写不进文档。&lt;/p&gt;&#10;&lt;p&gt;还有个 skel mode：以 root 跑时（预焙镜像），&lt;code&gt;HOME&lt;/code&gt; 重定向到 &lt;code&gt;/etc/skel&lt;/code&gt;，dotfiles 落进模板，Homebrew 延后到 &lt;code&gt;~/.comfort-shell-first-run&lt;/code&gt; 标记触发的新用户首次交互 shell。这正是&amp;quot;Windows 侧能在还没开过封的发行版上跑 bootstrap&amp;quot;的原因。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四路线三单语言-workloads--只要一门工具链"&gt;四、路线三：单语言 Workloads —— 只要一门工具链&#10;&lt;/h2&gt;&lt;p&gt;12 个 workload，每个是一个 &lt;code&gt;configuration.winget&lt;/code&gt; + 一个同名 &lt;code&gt;install.ps1&lt;/code&gt; shim：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Workload&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;装什么&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TypeScript&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Node.js LTS + 全局 &lt;code&gt;typescript&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PHP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PHP 8.5&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET SDK 10&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Go&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Go（rolling）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Java&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Microsoft Build of OpenJDK 25 LTS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rust&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rust stable via rustup&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Python&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Python 3.14 + uv&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQL Server + sqlcmd + VS Code 扩展&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PowerShell&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PowerShell 7 + VS Code PowerShell 扩展 + PSScriptAnalyzer 设置&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WinForms&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET SDK 10 + Windows Forms desktop workload&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WinAppCLI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开发者模式 + .NET SDK 10 + Windows App Development CLI&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WinUI 3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET SDK 10 + VS Community + Windows App SDK / WinUI 3 + WinAppCLI&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;跑的方式：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget configure &lt;span style="color:#f92672"&gt;-f&lt;/span&gt; .\Workloads\python\configuration.winget --accept-configuration-agreements --disable-interactivity&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 想要当前 shell 的 PATH 立刻刷新，改用 shim：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\Workloads\python\install.ps1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;WinUI 3 例外&lt;/strong&gt;，它跟 Dev Config 同一套引擎，一行就行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;irm https&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;//aka.ms/devconfig/winui/setup.ps1 | iex&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置长什么样？看 &lt;code&gt;python/configuration.winget&lt;/code&gt; 全文就明白了 —— 一共 20 行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;$schema&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/2023/08/config/document.json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;winget&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;processor&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dscv3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;resources&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Python&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Microsoft.WinGet/Package&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;properties&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Python.Python.3.14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;source&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;winget&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;acceptAgreements&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;winget&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;securityContext&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;elevated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Uv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Microsoft.WinGet/Package&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;properties&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;astral-sh.uv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;source&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;winget&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;acceptAgreements&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;winget&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;securityContext&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;elevated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就是一份 DSC v3 文档。理解了这一点，你自己加一门语言就是往上再加一个 resource。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;改之前先验证&lt;/strong&gt;，&lt;code&gt;winget configure&lt;/code&gt; 有个 &lt;code&gt;test&lt;/code&gt; 动词，跑 &lt;code&gt;TestScript&lt;/code&gt; 判断系统当前是否已在目标状态，&lt;strong&gt;不装任何东西&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget configure test -&lt;span style="color:#f92672"&gt;-file&lt;/span&gt; .\Workloads\python\configuration.winget --accept-configuration-agreements --disable-interactivity&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="五winget-configure-的三个前置条件踩过才懂"&gt;五、&lt;code&gt;winget configure&lt;/code&gt; 的三个前置条件（踩过才懂）&#10;&lt;/h2&gt;&lt;p&gt;除 Dev Config 外，其余 flow 全靠 &lt;code&gt;winget configure&lt;/code&gt;。它有三个前置条件，缺任一则 &lt;code&gt;install.ps1&lt;/code&gt; 会先报错退出：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;App Installer（winget）必须够新&lt;/strong&gt; —— 从 Microsoft Store 更新，或从 winget-cli releases 拉最新 MSIX。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Configuration 特性必须打开&lt;/strong&gt; —— 新版 winget 上已 GA 且默认开；旧版可能要 &lt;code&gt;winget settings&lt;/code&gt; 里设 &lt;code&gt;experimentalFeatures.configuration = true&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;组策略 / MDM 必须允许&lt;/strong&gt; —— 如果注册表 &lt;code&gt;HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppInstaller\EnableWindowsPackageManagerConfiguration&lt;/code&gt; 是 &lt;code&gt;0&lt;/code&gt;，整台机器被禁用，得先改策略。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;冒烟测试：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget configure --help | Select-Object -First &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="那个著名的内部错误"&gt;那个著名的内部错误&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;非提权&lt;/strong&gt;环境下调 &lt;code&gt;winget configure&lt;/code&gt;，必须先装 Visual C++ Redistributable，否则报 &lt;code&gt;internal error / -2146233079&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install Microsoft.VCRedist.&lt;span style="color:#ae81ff"&gt;2015&lt;/span&gt;+.x64 &lt;span style="color:#75715e"&gt;# x64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install Microsoft.VCRedist.&lt;span style="color:#ae81ff"&gt;2015&lt;/span&gt;+.arm64 &lt;span style="color:#75715e"&gt;# ARM64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;每个 &lt;code&gt;install.ps1&lt;/code&gt; shim 会先跑 &lt;code&gt;Workloads/_common/assert-winget-configure.ps1&lt;/code&gt;，它会明确告诉你是上面三条里的哪一条没满足。仓库的 &lt;code&gt;enable-winget-configure.ps1&lt;/code&gt; 也会自动把 VC Redist 装上。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="六能不能撤销答案有点狠"&gt;六、能不能撤销？答案有点狠&#10;&lt;/h2&gt;&lt;p&gt;能，但要先知道代价。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 提权 PowerShell&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$env:ProgramData&lt;span style="color:#e6db74"&gt;\CalmOS\dev-config.ps1&amp;#34;&lt;/span&gt; -Action Uninstall&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 从源码目录（未签名开发模式）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.\src\windows-dev-config\dev-config.ps1 -AllowUnsigned -Action Uninstall&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ &lt;strong&gt;Cleanup 是破坏性的、无确认提示。&lt;/strong&gt; 它会&lt;strong&gt;永久删除 Ubuntu 发行版及其文件&lt;/strong&gt;（等价 &lt;code&gt;wsl --unregister Ubuntu&lt;/code&gt;），并卸载全部工具。&lt;strong&gt;即便你之前只跑过 Standard，清理也会按 Full 的配置来重置。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;code&gt;-Action Uninstall&lt;/code&gt; 会：禁用 Sudo / 开发者模式 / 远程桌面，重置资源管理器、开始菜单、搜索、通知、Widgets、Edge 策略、长路径；主题切回 light；移除 Terminal 里的 &lt;code&gt;defaultProfile&lt;/code&gt;、各 profile 项与 Copilot fragment；移除托管的 Oh My Posh profile block、WinUI 模板；卸载 17 个工具包（uv、NVM、Node.js、Python 3.14、Git、GitHub CLI、Oh My Posh、.NET SDK 10、PowerToys、VS Code、Windows App CLI、PowerShell 7 等）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;不会恢复的&lt;/strong&gt;：字体、Windows Terminal 本体、VC++ runtime、WinGet 及 Windows 可选功能、setup 文件与日志。&lt;/p&gt;&#10;&lt;p&gt;想手动清理：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget uninstall --id &amp;lt;id&amp;gt; &lt;span style="color:#75715e"&gt;# 按 winget id 卸包&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wsl --unregister Ubuntu &lt;span style="color:#75715e"&gt;# 不可逆&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Remove-Item &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$env:LOCALAPPDATA&lt;span style="color:#e6db74"&gt;\Microsoft\Windows Terminal\Fragments\DevConfig&amp;#34;&lt;/span&gt; -Recurse -Force&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Remove-Item &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$env:ProgramData&lt;span style="color:#e6db74"&gt;\CalmOS&amp;#34;&lt;/span&gt; -Recurse -Force &lt;span style="color:#75715e"&gt;# 需管理员&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结论：别在你唯一的生产机上试。&lt;/strong&gt; 用一次性 Windows Sandbox / Hyper-V / Dev Box 镜像。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七安全视角irm--iex-到底在执行什么"&gt;七、安全视角：&lt;code&gt;irm | iex&lt;/code&gt; 到底在执行什么&#10;&lt;/h2&gt;&lt;p&gt;看到 &lt;code&gt;irm &amp;lt;url&amp;gt; | iex&lt;/code&gt; 就皱眉是对的 —— 这是在内存里执行远端下载的脚本。这条链路的实际防护是：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;bootstrap.ps1&lt;/code&gt; &lt;strong&gt;验证 Microsoft Corporation 签名&lt;/strong&gt;，逐个校验仓库 &lt;code&gt;windows-dev-config/&lt;/code&gt; 下每一个 &lt;code&gt;.ps1&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;落到 &lt;strong&gt;&lt;code&gt;%ProgramData%\CalmOS&lt;/code&gt;&lt;/strong&gt;，只有 Administrators / SYSTEM 可写，普通用户只读可执行（防篡改：下载者 = 执行者 ≠ 写入者）。&lt;/li&gt;&#10;&lt;li&gt;用&lt;strong&gt;进程级 &lt;code&gt;RemoteSigned&lt;/code&gt;&lt;/strong&gt;，不往 trusted publishers 里加东西。组织强制的 &lt;code&gt;AllSigned&lt;/code&gt; 仍可能弹窗。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这比&amp;quot;官网下载 exe 双击&amp;quot;其实更严格一些，但本质承诺是：&lt;strong&gt;你信任 Microsoft 的这个签名&lt;/strong&gt;。第三方 fork 的 &lt;code&gt;aka.ms&lt;/code&gt; 链接不是一回事。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="八贡献者必读仓库有两棵树"&gt;八、贡献者必读：仓库有两棵树&#10;&lt;/h2&gt;&lt;p&gt;这条如果不提前知道，PR 一定会被打回。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; SRC["src/**&lt;br/&gt;源码 · 唯一真相&lt;br/&gt;CI 跑的是这里"] --&gt;|"OneBranch 签名流水线&lt;br/&gt;.pipelines/OneBranch.SignAndPackage.yml"| TOP["顶层三目录&lt;br/&gt;windows-dev-config/ · Workloads/ · wsl-comfort/&lt;br/&gt;Authenticode 签名发布副本"]&#10; MF["src/manifest.yml&lt;br/&gt;所有 flow 的路径/命令/id"] --&gt; CI["CI harness"]&#10; MF --&gt; EXT["Command Palette 扩展&lt;br/&gt;src/future/cmdpal"]&#10; MF --&gt; SHIM["每个 install.ps1 shim"]&#10;&#10; style SRC fill:#2d6cdf,stroke:#1c4a9e,color:#fff&#10; style TOP fill:#8a6d3b,stroke:#5f4a25,color:#fff&#10; style MF fill:#7a4c9e,stroke:#523073,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;规则&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;改 &lt;code&gt;src/&lt;/code&gt;，别改顶层那三个目录。&lt;/strong&gt; CI 跑的是未签名的 &lt;code&gt;src/&lt;/code&gt; 副本 —— 这是刻意的：CI 测贡献者改的东西，签名是发布时才关心的事。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;两份副本不会字节相同。&lt;/strong&gt; 签名副本带 &lt;code&gt;# SIG # Begin signature block&lt;/code&gt; 块；块以上的正文应与 &lt;code&gt;src/&lt;/code&gt; 一致，但在&amp;quot;src 改动进 main&amp;quot;到&amp;quot;下一次签名周期&amp;quot;之间会短暂不一致。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;删除文件是唯一必须动两棵树的情况。&lt;/strong&gt; 签名流水线只增改、不删除 —— 从 &lt;code&gt;src/&lt;/code&gt; 删掉的文件会永远留在顶层。所以删或重命名时，同一个 PR 里必须 &lt;code&gt;git rm&lt;/code&gt; 两处。&lt;/li&gt;&#10;&lt;li&gt;有个 &lt;strong&gt;&lt;code&gt;Signed copy guard&lt;/code&gt;&lt;/strong&gt; PR 检查（&lt;code&gt;.github/workflows/signed-copy-guard.yml&lt;/code&gt;），只在 PR 触及那三个顶层目录时运行，用 &lt;code&gt;src/tools/check-signed-drift.ps1&lt;/code&gt; 做比较器判定漂移，漂移即 fail。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;提交前可以跑这几个静态检查（不动机器状态）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# PowerShell 语法检查（不执行）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Get-ChildItem -Recurse -Filter *.ps1 | ForEach-Object {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $errs = $null&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#66d9ef"&gt;void][System.Management.Automation.Language.Parser&lt;/span&gt;]::ParseFile($_.FullName, [&lt;span style="color:#66d9ef"&gt;ref&lt;/span&gt;]$null, [&lt;span style="color:#66d9ef"&gt;ref&lt;/span&gt;]$errs)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($errs) { Write-Error &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$($_.FullName)&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;$errs&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; { &lt;span style="color:#e6db74"&gt;&amp;#34;OK: &lt;/span&gt;$($_.Name)&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Invoke-ScriptAnalyzer -Recurse -Path ./Workloads, ./tests/_harness&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3 -c &lt;span style="color:#e6db74"&gt;&amp;#34;import yaml; yaml.safe_load(open(&amp;#39;manifest.yml&amp;#39;))&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;跑单个 flow 的端到端测试就是 CI 做的事：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./tests/_harness/run-flow.ps1 -Id typescript `&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Build &lt;span style="color:#e6db74"&gt;&amp;#39;tsc tests/typescript/hello.ts&amp;#39;&lt;/span&gt; `&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Run &lt;span style="color:#e6db74"&gt;&amp;#39;node tests/typescript/hello.js&amp;#39;&lt;/span&gt; `&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Expected tests/typescript/expected.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 期望输出尾部：&amp;#34;INSTALL_OK: typescript&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="九排障速查表"&gt;九、排障速查表&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;现象&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;原因与处理&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Unrecognized command: configure&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;跑 &lt;code&gt;winget configure --enable&lt;/code&gt;；仍不行用 &lt;code&gt;Workloads/_common/assert-winget-configure.ps1&lt;/code&gt; 判断是 App Installer 太旧、策略禁用还是别的原因&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;internal error&lt;/code&gt; / &lt;code&gt;-2146233079&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;非提权环境缺 VC++ Redist，装对应架构的 &lt;code&gt;Microsoft.VCRedist.2015+.x64&lt;/code&gt; / &lt;code&gt;.arm64&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;装成功了但 &lt;code&gt;python&lt;/code&gt; / &lt;code&gt;node&lt;/code&gt; 不在 PATH&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新开终端，或跑同名 &lt;code&gt;install.ps1&lt;/code&gt; shim 在当前会话刷新 PATH&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dev Config 重启后像卡住&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;WindowsDevConfigResume&lt;/code&gt; 任务在登录后约 30 秒自动继续。等两分钟没动静就&lt;strong&gt;再跑一次原命令&lt;/strong&gt; —— 幂等，会跳过已完成的&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;某几步显示 &lt;code&gt;flagged&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;best-effort 项未完成/未确认，多因依赖包刚装 PATH 还没注册（WinUI 模板需要 .NET SDK 在 PATH，Copilot 插件需要 Copilot CLI）。重跑即可，成功的秒过&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wsl --install ... failed with exit code -1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬件虚拟化没开。物理机进 BIOS/UEFI 开 VT-x / AMD-V；VM 在 Hyper-V 宿主上（客户机关机）：&lt;code&gt;Set-VMProcessor -VMName &amp;lt;VM_NAME&amp;gt; -ExposeVirtualizationExtensions $true&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WSL Comfort 因缺 WSL 失败&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在 Windows 侧跑 &lt;code&gt;.\wsl-comfort\install.ps1&lt;/code&gt;，它会先装 WSL&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;ldquo;Setup is already running in another window&amp;rdquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;切到另一个窗口；确认没在跑说明上次进程没干净退出，&lt;strong&gt;注销再登录&lt;/strong&gt;后重试&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;ldquo;Windows Terminal settings 无法解析为 JSON&amp;rdquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;settings.json&lt;/code&gt; 有语法错误，按提示修或重命名后重跑（脚本会保留原文件并跳过该步）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下载失败/超时&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;多为代理。&lt;code&gt;winget&lt;/code&gt; 和 WinHTTP 都要配代理：&lt;code&gt;netsh winhttp show proxy&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;都不适用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;看日志 &lt;strong&gt;&lt;code&gt;devconfig-log.txt&lt;/code&gt;&lt;/strong&gt;（通常在 &lt;code&gt;%ProgramData%\CalmOS&lt;/code&gt;），带着 &lt;code&gt;winver&lt;/code&gt;、命令、相关片段去 &lt;a class="link" href="https://github.com/microsoft/WindowsDeveloperConfig/issues" target="_blank" rel="noopener"&#10; &gt;Issues&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十它适合你吗"&gt;十、它适合你吗&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;每次重装系统都要重来一遍装机的 Windows 开发者。&lt;/li&gt;&#10;&lt;li&gt;想要现成的现代化终端体验（Oh My Posh + Nerd Font + Starship），但懒得自己配。&lt;/li&gt;&#10;&lt;li&gt;需要 Repeatable 环境的场景：Dev Box、实验室镜像、CI runner 镜像、&lt;code&gt;src/&lt;/code&gt; 里加一门语言就能批量铺开。&lt;/li&gt;&#10;&lt;li&gt;教学/布道：一行命令让学员拿到和讲师一致的環境。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;不适合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;想精细控制每一个选项的人&lt;/strong&gt; —— 它明确写着 opinionated。Full 会开 Sudo、远程桌面、改 Edge 策略，不是所有人都想要。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;日常主力机直接跑&lt;/strong&gt; —— 卸载会把自己装的 Python/Node/Git 一并卸掉，还会删 Ubuntu。先在 Sandbox 或虚拟机里跑一遍。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;离不开 zsh 全套自定义的人&lt;/strong&gt; —— WSL Comfort 会整块替换托管块内的 dotfiles 内容，块外的编辑没事，块内的会丢。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;非 Ubuntu 用户&lt;/strong&gt; —— Comfort Shell 两半都只认 Ubuntu，其它发行版在 preflight 就被拒。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="我的建议上手路径"&gt;我的建议上手路径&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;建一个 &lt;strong&gt;Windows Sandbox 或 Hyper-V 一次性虚拟机&lt;/strong&gt;（若是 Hyper-V 客户机，先开嵌套虚拟化）。&lt;/li&gt;&#10;&lt;li&gt;先跑 &lt;code&gt;winget configure test --file .\Workloads\python\configuration.winget&lt;/code&gt; 之类的 dry-check，&lt;strong&gt;只看不改&lt;/strong&gt;，感受一下 DSC 资源的粒度。&lt;/li&gt;&#10;&lt;li&gt;再跑 &lt;code&gt;.\Workloads\python\install.ps1&lt;/code&gt;，确认 shim 的 PATH 刷新行为。&lt;/li&gt;&#10;&lt;li&gt;最后再考虑 &lt;code&gt;irm https://aka.ms/devconfig/standard/setup.ps1 | iex&lt;/code&gt; —— 记住会重启一次，会顺手帮你把 WSL + Ubuntu 装好。&lt;/li&gt;&#10;&lt;li&gt;觉得哪里不爽，去 &lt;code&gt;src/&lt;/code&gt; 里改 —— 这才是仓库希望你做的。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;最后说句实在的：这类&amp;quot;官方装机脚本&amp;quot;最大的价值从来不是&amp;quot;省下那两小时&amp;quot;，而是&lt;strong&gt;把一套经过验证的环境定义变成可版本控制、可 review、可 CI 测试的文本&lt;/strong&gt;。今天它帮你装的是 Python 3.14 和 .NET 10，明天你往 &lt;code&gt;manifest.yml&lt;/code&gt; 里加一条，团队二十台机器就同步了。这才是 IaC（Infrastructure as Code）在个人开发机上的正确用法。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>