Windows + WSL2 Arch 双层开发环境从零搭建笔记
从裸机开始:Windows 初始化、精简、坚果云+KeePassXC 密钥体系、GPG 签名与 GCM 凭证,再到 WSL2 Arch 全套:zsh、mise 工具链、Git 签名与凭证桥接、镜像源。
总览
整套环境分两层:Windows 宿主承载 GUI 类基础设施(密码库、文件同步、GPG 密钥环、凭证管理器),WSL2 Arch 承担日常开发。两层通过 WSL interop 桥接,密钥与凭证全局共享,互不冲突。
Windows 宿主
├── 坚果云 (文件同步) + KeePassXC (密码库+SSH密钥,库文件放坚果云目录)
├── OpenSSH Authentication Agent ← KeePassXC SSH代理(OpenSSH模式)注入密钥
├── Git for Windows + GCM (Git Credential Manager) ← 凭证中心
├── Gpg4win (Kleopatra + pinentry-qt) ← 签名密钥环 + 好看的密码框
└── mise (WinGet 版) ← Windows 侧版本管理
│ interop
WSL2 Arch Linux
├── mise: node/npm/pnpm/python/rust/uv/go/zig 多语言版本管理
├── git: commit+tag 全自动签名 (调 Windows gpg.exe)
├── credential: 桥接 Windows GCM (GitHub 凭证共享)
├── ssh: 直接用 Windows ssh.exe(别名抹掉后缀,密钥走 KeePassXC→agent)
└── 现代 CLI 工具箱 (bat/eza/fzf/fd/ripgrep/yazi...)
搭建顺序有讲究:先更新后精简(精简可能移除更新组件)、先密码/同步后开发(KeePassXC 里存着密钥备份)、Windows 侧密钥/凭证体系就位后 WSL 才有程序可调用。
第一部分:Windows 宿主从零配置
1.1 系统安装与全量更新
系统装完进桌面后,第一件事是把所有补丁打齐:
设置 → Windows 更新 → 检查更新 → 重启 → 再检查,循环直到"你使用的是最新版本"
Microsoft Store → 库(右上角) → 获取更新,把商店应用全部更完
1.2 驱动安装
系统安装和全量更新过程中,Windows Update 已经自动装完一部分驱动。剩下两步:
- 笔记本厂商官网下载对应机型的驱动包,安装/补充一遍(热键、触控板、电源管理等增值驱动)
- NVIDIA 官网下载最新显卡驱动,覆盖掉系统内的低版本驱动
基本就完事了。WSL2 不需要额外驱动——GPU 直通(CUDA on WSL)用的就是 Windows 侧驱动。
1.3 AME Wizard + ReviOS 精简
系统组件完整、驱动就位后,再做精简:
- 官网下载 AME Wizard(playbook 运行器)与 ReviOS playbook(精简脚本包)
- 运行 AME Wizard,加载 ReviOS playbook
- 向导会自动创建系统还原点
- 按需勾选精简项(遥测、预装应用、后台服务等),应用后重启
注意:
- 精简项看清楚再勾,涉及 Store/更新组件的选项要明白后果
- 出问题用还原点回滚
- 精简做完再装日常软件,避免被脚本误伤
1.4 WinGet 换源
首次用 WinGet 前先把源换成国内镜像(默认三源:winget/winget-font/msstore,国内慢且 msstore 无用):
winget source remove msstore # 商店源,删掉
winget source remove winget
winget source remove winget-font
winget source add winget https://mirrors.ustc.edu.cn/winget-source
winget source add winget-font https://mirrors.ustc.edu.cn/winget-fonts
winget source list # 确认只剩两个 USTC 源
1.5 基础软件:Brave + 坚果云 + KeePassXC
winget install Brave.Brave # 浏览器
winget install Nutstore.Nutstore # 坚果云:文件同步
winget install KeePassXCTeam.KeePassXC # 密码管理
KeePassXC 先装——密码库是后续一切密钥管理的根据地:
组装方式:
- KeePassXC 的
.kdbx数据库文件放在坚果云同步目录里 → 多机密码库自动同步 - SSH 私钥作为附件存进 kdbx,配合 SSH Agent 集成(见 1.7)——密钥不落裸文件
- GPG 私钥的加密备份也可作为附件存进 kdbx,随坚果云走(主密码强度是安全边界,弱密码等于裸奔)
- 坚果云实际同步的是 KeePassXC 的
.kdbx密码数据库文件;SSH 私钥附件和 GPG 加密备份都随数据库一起同步,免费流量对这类小文件完全够用
1.6 开发环境(WinGet 一把装)
winget install Microsoft.PowerShell # PowerShell 7
winget install Git.Git # Git + GCM 凭证助手(系统级默认启用),自带 git-lfs
winget install GnuPG.Gpg4win # GPG 签名,选 Gpg4win 见下表
winget install jdx.mise # mise:Windows 侧版本管理
winget install JanDeDobbeleer.OhMyPosh # PowerShell 提示符美化
winget install Microsoft.VisualStudio.BuildTools # C++ 桌面开发工作负载(Rust MSVC 前置),装完在 VS Installer 里勾选
# 现代 CLI 工具
winget install sharkdp.bat # cat
winget install eza-community.eza # ls
winget install sharkdp.fd # find
winget install BurntSushi.ripgrep.MSVC # grep
winget install junegunn.fzf # 模糊搜索
winget install ajeetdsouza.zoxide # cd 智能跳转
winget install sxyazi.yazi # 文件管理器(Windows 侧需配 YAZI_FILE_ONE,见下文)
winget install XAMPPRocky.Tokei # 代码行数统计
winget install Fastfetch-cli.Fastfetch # 系统信息
winget install aristocratos.btop4win # 系统监控(btop 的 Windows 版)
winget install Justsenger.ExHyperV # Hyper-V 管理增强
winget install Zellij.Zellij # 终端复用器(tmux 现代替代)
winget install Neovim.Neovim # 编辑器(配 git core.editor)
# PSFzf 模块(fzf 的 PowerShell 键绑定):
Install-Module PSFzf -Scope CurrentUser
日常软件同样走 WinGet(按需):
winget install Bandisoft.Bandizip # 压缩
winget install QL-Win.QuickLook # 空格预览文件
winget install Microsoft.PowerToys # 微软效率套装
winget install PremiumSoft.NavicatPremium # 数据库管理(MySQL/PostgreSQL/Redis 等)
winget install OBSProject.OBSStudio # 录屏/直播
winget install PixPin.PixPin # 截图/贴图
winget install NetEase.UURemote # 远程
winget install LocalSend.LocalSend # 局域网文件互传(手机↔电脑,免数据线)
winget install Famatech.AdvancedIPScanner # 局域网设备扫描(找 IP/开放端口)
winget install Valve.Steam # 游戏平台
# 通讯
winget install Tencent.WeChat.Universal # 微信
winget install Tencent.QQ.NT # QQ
winget install Alibaba.DingTalk.Mainland # 钉钉
winget install ByteDance.Feishu # 飞书
# 输入法
winget install Tencent.WeType # 微信输入法
没有 WinGet 版本、需官网下载安装包手动装的:
| 软件 | 说明 |
|---|---|
| 火绒安全 | 安全软件 |
| WeGame | 腾讯游戏平台 |
| KOOK | 游戏语音 |
| MuMu 模拟器 | 网易安卓模拟器 |
PowerShell 的 $PROFILE 完整配置(oh-my-posh 提示符 + mise 激活 + zoxide/fzf 集成 + 别名;主题 ys 与 WSL 侧 zsh 同名,两边视觉统一):
(&mise activate pwsh) | Out-String | Invoke-Expression # mise 激活
oh-my-posh init pwsh --config 'ys' | Invoke-Expression
Invoke-Expression (& { (zoxide init powershell | Out-String) }) # z 智能跳转
Import-Module PSFzf # Ctrl-R 历史 / Ctrl-T 文件模糊搜索
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'
$env:FZF_DEFAULT_COMMAND = 'fd --type file' # fzf 默认用 fd 找文件,更快
$env:FZF_CTRL_T_COMMAND = 'fd --type file'
# 别名(与 WSL 保持一致;带参数的用函数再 Set-Alias 指过去)
function eza-ls { eza --icons=auto @args }
function eza-ll { eza -la --icons=auto --git @args }
function bat-cat { bat --paging=never @args }
Set-Alias -Name ff -Value fastfetch
Set-Alias -Name ls -Value eza-ls
Set-Alias -Name ll -Value eza-ll
Set-Alias -Name cat -Value bat-cat
Set-Alias -Name e -Value explorer
带默认参数的别名(ls/ll/cat)用「函数 + Set-Alias」实现:Set-Alias 本身不能携带参数,而内置 ls/cat 别名优先级又高于同名函数,所以函数按 工具-别名 取独立名(eza-ls 等),再由 Set-Alias 覆盖内置别名指向它。
Windows Terminal 无需安装——Win11 自带,1.1 的 Store 更新步骤里已把它更到最新。
关于 GnuPG 的两个软件包:安装 GnuPG.Gpg4win 会自动带上 GnuPG.GnuPG(作为依赖,winget list 里两条共存是正常形态,别去卸载小包——共用安装目录,卸了会摧毁签名链路)。
| 包 | pinentry | 定位 |
|---|---|---|
GnuPG.GnuPG |
pinentry-basic.exe(极简 Win32) |
GnuPG 核心,Gpg4win 的依赖 |
GnuPG.Gpg4win |
pinentry-qt(现代外观/暗色适配) |
全家桶 + Kleopatra 密钥管理 GUI |
装 Gpg4win 即可:签名时桌面弹出 Qt 密码框,WSL 里 commit 时体验一致。
Windows 侧 mise 工具链
Windows 与 WSL 是两套独立 mise,各自装各自的工具,互不干扰。pwsh 里执行:
mise use -g node@lts npm@latest pnpm@latest python@latest
mise use -g rust@nightly uv@latest
mise use -g go@latest zig@latest
($PROFILE 里的 mise activate pwsh 负责激活;Python 与 uv 的项目级配合见「mise + uv」章节。)
长路径支持
Windows 默认路径上限 260 字符(MAX_PATH),node_modules 嵌套深度轻松超限,npm/pnpm 装深依赖链随机报错。两个开关都要开:
# ① 系统层(设置应用,改完重启生效)
设置 → 系统 → 高级 → 文件资源管理器
→ 启用长路径支持 → 开
# ② git 层
git config --global core.longpaths true
开发人员模式
同一个设置页面(系统 → 高级)的开发者选项组里,开启开发人员模式——不开的话,git clone 含软链接(symlink)的仓库时符号链接会被写成普通文本文件而非真正的链接。开启后 git for Windows 才能正常创建 symlink。
# git 侧配套(允许 git 创建符号链接)
git config --global core.symlinks true
Windows 侧 Git 全套配置(与 WSL 对称)
git config --global user.name "Fucheng Sha" # 替换成你的名字
git config --global user.email "fcsha@qq.com" # 替换成你的邮箱
git config --global init.defaultBranch main
git config --global core.autocrlf false
git config --global core.quotepath false # 中文文件名不转义
git config --global core.editor nvim
git config --global gpg.program "C:\Program Files\GnuPG\bin\gpg.exe"
git config --global user.signingkey 2F99B3AF794163DB7E4C1F389932A09BFB70E324 # 替换成你的签名子钥指纹
git config --global commit.gpgsign true
git config --global tag.gpgsign true
凭证无需配置——GCM 系统级默认启用(见 1.9)。
Windows 侧镜像源汇总
| 工具 | 配置方式 | 镜像 |
|---|---|---|
| npm/pnpm | 命令 | npm config set registry https://registry.npmmirror.com |
| cargo | 配置文件 | ~/.cargo/config.toml(内容见下方) |
| rustup | 环境变量 | RUSTUP_DIST_SERVER = https://mirrors.ustc.edu.cn/rust-static |
| rustup | 环境变量 | RUSTUP_UPDATE_ROOT = https://mirrors.ustc.edu.cn/rust-static/rustup |
| uv | 环境变量 | UV_DEFAULT_INDEX = https://pypi.tuna.tsinghua.edu.cn/simple |
| WinGet | 命令 | 见 1.4 换源小节(USTC) |
环境变量用 GUI 设置:Win+R 运行 sysdm.cpl → 高级 → 环境变量 → 用户变量 → 新建。
cargo 镜像的 ~/.cargo/config.toml(Windows 与 WSL 通用同一份写法):
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
[registries.ustc]
index = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
[net]
git-fetch-with-cli = true
各块的作用:
[source.crates-io]+replace-with = 'ustc':替换规则——凡是要去 crates.io 的流量,改去名叫ustc的源(名字自定义,但必须与下面的[source.ustc]一致)[source.ustc]:源定义——名叫 ustc 的镜像地址。缺了它替换规则报 unknown source;只有它没有替换规则则镜像白配(没人用它)[registries.ustc]:命名注册表——给cargo search --registry ustc xxx显式指定用(search 不走替换链,必须指名);日常 build/add 用不到git-fetch-with-cli = true:拉取 git 依赖时改调系统git命令而非 cargo 内置实现——你的 git 代理、凭证配置自动生效,避免“命令行 git 正常、cargo 拉 git 依赖却失败”的错位
yazi 文件识别(YAZI_FILE_ONE)
Windows 没有原生 file 命令,yazi 识别文件类型(预览、选打开方式)就没了着落。不需要单独装——Git for Windows 已经带了一份,用环境变量 YAZI_FILE_ONE 指过去即可(与 gpg.exe、GCM 桥接同款“借用 Git”套路):
[Environment]::SetEnvironmentVariable("YAZI_FILE_ONE", "C:\Program Files\Git\usr\bin\file.exe", "User")
(或用 sysdm.cpl 的 GUI 方式新建同名用户变量。)设置后重开终端生效。WSL 侧无需任何配置——Arch 的 base 依赖里已含 file。
1.7 SSH 密钥:KeePassXC 管理 + Windows ssh-agent
SSH 密钥不落裸文件,直接收敛进 KeePassXC(kdbx 库随坚果云同步,主密码是安全边界):
- 启用 Windows 服务
OpenSSH Authentication Agent(服务管理器设为自动启动) - KeePassXC 开启 SSH 代理:Tools → Settings → SSH Agent → 勾选启用,代理实现选 OpenSSH(不是 Pageant——那是 PuTTY 生态的)
- 把 SSH 私钥作为附件存进 KeePassXC 条目,条目设置里关联到 SSH Agent(KeeAgent 兼容配置)
- 解锁数据库时密钥自动注入 Windows ssh-agent,锁库自动移除——锁屏/锁库 = 密钥下线,安全性比裸私钥文件高一档
效果:
密钥本体: KeePassXC(kdbx, 坚果云同步) ← 单一事实源
↓ 解锁注入
Windows: OpenSSH Authentication Agent ← ssh.exe 直接用
↓ WSL(ssh.exe 别名)
WSL: git/ssh 共用同一把钥匙
Windows 侧验证:
ssh-add -l # 列出 agent 里的钥匙指纹(KeePassXC 解锁状态下)
1.8 导入 GPG 密钥
全部用 Kleopatra 完成:
- 打开 Kleopatra → 导入 → 选密钥文件即可
- 验证:主界面密钥列表出现你的密钥(双击可看指纹与子钥)
口令缓存:别让每次 commit 都弹密码框
GPG 默认缓存策略很烦人:10 分钟没操作就忘掉口令,最长也只记 2 小时——一天码代码要弹好几次。
先分清两个“有效期”——容易混:
| 概念 | 管什么 | 在哪改 |
|---|---|---|
| 密钥有效期 | 密钥到期能否继续签(建议永久或远期) | Kleopatra 右键密钥 → 更改有效期 |
| 口令缓存 TTL | 输过一次密码后多久内不再问(本文要配的) | Kleopatra 设置 |
Kleopatra 里改:Settings → Configure Kleopatra → GnuPG System → Private Keys,改界面里的两项(注意 GnuPG 出身智能卡世界,“PIN”即私钥口令 passphrase):
| 界面项 | 默认 | 建议 |
|---|---|---|
| Expire cached PINs after N seconds | 600 | 86400(24 小时) |
| Set maximum PIN cache lifetime to N seconds | 7200 | 86400(24 小时) |
两项设相同的值:
- 前者是滑动窗口:每用一次重新计时——若上限更长,天天用可能好几天不弹
- 后者是绝对上限:到点必忘
- 两项相同 → 每个周期只输一次,如都设 86400 即每天最多输一次;关机重启缓存清零,开机后第一次 commit 必弹
保存即自动生效(Kleopatra 会重载 agent),此后按你设的节奏弹 Qt 密码框。
1.9 GCM 凭证初始化
Git for Windows 已在系统级配置默认启用 GCM(C:\Program Files\Git\etc\gitconfig 里 [credential] helper = manager),无需手动设置。首次 clone 时按 GCM 提示完成认证即可,凭证存 Windows 凭证管理器,之后静默复用。
查看/删除凭证(命令行或控制面板 → 凭据管理器都可以):
cmdkey /list # 查看
cmdkey /delete:LegacyGeneric:target=git:https://git.example.com # 删除
第二部分:WSL2 Arch
2.1 安装与 root 阶段初始化
wsl --install -d ArchLinux
首次进入系统时默认是 root,按顺序依赖初始化:
# 1. 给 root 设密码(裸机默认无密码,之后 su 切 root 时使用)
passwd root
# 2. 先同步源(裸机 pacman 数据库是空的,装任何东西前必做)
pacman -Syu
# 3. 装镜像测速工具 → 再优选镜像源(reflector 不在 base 里,裸机没有)
pacman -S reflector
reflector --country China --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
# 4. locale: 先取消注释 → 生成 → 再设默认(顺序反了 LANG 指向不存在的 locale)
sed -i 's/^#en_US.UTF-8/en_US.UTF-8/; s/^#zh_CN.UTF-8/zh_CN.UTF-8/' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf # 界面英文 + 能显示中文,推荐组合
# 5. 建用户的前置依赖: zsh 必须先装,否则 useradd -s /bin/zsh 指向不存在的 shell
pacman -S sudo zsh
# sudo 授权: drop-in 文件(独立于主文件,风险隔离、升级免冲突;权限必须 440)
echo 'FC ALL=(ALL:ALL) ALL' > /etc/sudoers.d/FC && chmod 440 /etc/sudoers.d/FC
2.2 建用户 + 工具包
useradd -m -G wheel -s /bin/zsh FC
passwd FC
# 默认登录用户设为 FC: wsl.conf 里 [user] default 指认(不设则每次进 WSL 都是 root)
cat > /etc/wsl.conf <<'EOF'
[user]
default=FC
EOF
su - FC
sudo pacman -S base base-devel git git-lfs mise curl wget fastfetch nano \
btop fd fzf jq ripgrep bat eza tokei yazi zoxide neovim zellij
/etc/wsl.conf 下次启动时生效:退出 WSL 后,PowerShell 里执行 wsl --terminate ArchLinux(或 wsl --shutdown),再重新进入即以 FC 登录。
git-lfs 是易漏项:Git for Windows 自带 LFS,而 Arch 的 git 包不含——少装的话 git lfs 直接报 'lfs' is not a git command,clone 用了 LFS 的仓库只会下到一堆指针文件。装完还要每用户执行一次 git lfs install 写入全局 filter(见 2.5)。
2.3 zsh 环境
先装 oh-my-zsh(安装脚本会生成 .zshrc,额外配置放在安装之后)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
安装脚本已经写入主题、插件和 oh-my-zsh 加载逻辑,不要覆盖这些内容。要与 Windows 侧保持一致,只把生成配置里的主题值改为 ys,再把下面这些额外配置追加到 ~/.zshrc 底部:
# 镜像加速(rustup 工具链下载 / uv 走 PyPI 清华源)
export RUSTUP_DIST_SERVER="https://mirrors.ustc.edu.cn/rust-static"
export RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup"
export UV_DEFAULT_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple"
# 工具初始化
eval "$(mise activate zsh)"
eval "$(zoxide init zsh)" # cd 智能跳转,替代 autojump
source <(fzf --zsh) # Ctrl-R 历史 / Ctrl-T 文件 / Alt-C 目录
# 别名
alias ff='fastfetch'
alias ls='eza --icons=auto'
alias ll='eza -la --icons=auto --git'
alias cat='bat --paging=never'
alias e='explorer.exe'
# dsh (DeepSeek Harness)
alias dsh='npx -y @deepseek-ai/dsh@latest'
# SSH: 路由到 Windows OpenSSH(密钥在 KeePassXC→Windows agent,见 1.7)
alias ssh='ssh.exe'
alias scp='scp.exe'
alias sftp='sftp.exe'
# 命名目录:~dev → WSL 侧,~dev-win → Windows 侧
hash -d dev=$HOME/dev
hash -d dev-win=/mnt/c/Users/FC/dev
--icons 必须写成 --icons=auto:eza 的这个 flag 支持可选值,裸写时会把下一个参数当作 always/auto/never 吞掉,ls <路径> 直接报错。hash -d 注册命名目录后,cd ~dev-win 即达 Windows 侧,提示符里的路径也会缩写成 ~dev-win/...。
2.4 mise 多语言工具链
.zshrc 配好后(mise activate 已就位),安装各语言工具链:
mise use -g node@lts npm@latest pnpm@latest python@latest
mise use -g rust@nightly uv@latest
mise use -g go@latest zig@latest
版本统一收敛在 ~/.config/mise/config.toml,项目级再放一份 mise.toml 即可锁定团队版本。Python 与 uv 的项目级配合见「mise + uv」章节。
WSL 侧镜像源汇总
npm/pnpm:
npm config set registry https://registry.npmmirror.com
cargo(~/.cargo 目录可能还不存在,先建):
mkdir -p ~/.cargo
cat > ~/.cargo/config.toml <<'EOF'
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
[registries.ustc]
index = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
[net]
git-fetch-with-cli = true
EOF
rustup / uv 的三个环境变量已追加到 2.3 的 .zshrc;pacman 镜像见 2.1 的 reflector。
2.5 Git 配置(签名 + 凭证桥接)
WSL 侧不装 OpenSSH、不存任何密钥文件——SSH 走 Windows 客户端(ssh.exe 别名见 2.3 的 .zshrc 追加配置,密钥在 KeePassXC → Windows ssh-agent)。
git config --global user.name "Fucheng Sha" # 替换成你的名字
git config --global user.email "fcsha@qq.com" # 替换成你的邮箱
git config --global init.defaultBranch main
git config --global core.autocrlf false
git config --global core.quotepath false # 中文文件名不转义
git config --global core.editor nvim
# 签名: 调 Windows Gpg4win
git config --global gpg.program "/mnt/c/Program Files/GnuPG/bin/gpg.exe"
git config --global user.signingkey 2F99B3AF794163DB7E4C1F389932A09BFB70E324 # 替换成你的签名子钥指纹
git config --global commit.gpgsign true # commit 全自动签名
git config --global tag.gpgsign true # tag 全自动签名
# 凭证: 桥接 Windows GCM (GitHub 凭证两边共享)
git config --global credential.helper '/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe'
# LFS: 写入全局 filter(2.2 装的 git-lfs 包不会自动配置,每用户执行一次)
git lfs install
桥接后 Windows 已授权过的站点,WSL 第一次 clone 直接成功,连弹窗都没有——token 存 Windows 凭证管理器,两边共享。
mise + uv:Python 的官方分工(Windows 与 WSL 通用)
uv 是 Rust 写的 Python 包/环境管理器(uv pip、uv venv、uv run、uvx),比 pip 快 10~100 倍。版本归 mise,包和 venv 归 uv——与 mise 的标准配合写进项目 mise.toml:
[tools]
python = "3.12" # mise 装并激活这个版本
uv = "latest" # uv 本身也归 mise
[env]
# 关键:把 uv 锁定到 mise 装的解释器,杜绝 uv 自己下载 Python
UV_PYTHON = { value = "{{ tools.python.path }}", tools = true }
[settings]
# cd 进项目自动建/激活 .venv,不再手动 source
python.uv_venv_auto = "create|source"
效果:cd 进项目 → mise 激活 3.12 和 .venv → uv pip install xxx 直接可用,解释器永远是 mise 装的那个(which python 指向 .venv/bin/python)。
踩过的坑:不设 UV_PYTHON 时,uv venv --python 3.12 在 mise 未激活 3.12 的目录里会自己下载一份 uv 管理的 3.12——uv 只认 PATH 上的裸命令,看不见 mise 仓库里装好但未激活的版本。.python-version 文件是两个工具的官方桥梁(mise 和 uv 都读它),mise use python@3.12 会自动写入。
日常不再需要手动 uv venv/source .venv/bin/activate——mise 全托管。这套配置 Windows 与 WSL 通用(两侧各写一份项目 mise.toml 即可)。