Skip to content
macOS-TerminalPublic

About

将Arch的Pacman迁移到Windows(Winget后台)

Resources

Stars

5 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

WinPac —— Windows 上的 pacman

把 Arch Linux 的 pacman 命令行体验移植到 Windows:相同的语法、相同的帮助文本、 相同的输出风格和确认提示,底层把每条命令翻译成 winget (Windows 包管理器)调用。

PS C:\> pacman -Ss vim
winget/Vim.Vim 9.1.0652
    Vim
winget/Neovim.Neovim 0.10.0
    Neovim
winget/Git.Git 2.47.0 [installed]
    Git

PS C:\> pacman -Syu
:: Synchronizing package databases...
:: Starting full system upgrade...
:: Proceed with installation? [Y/n]

语法、用法文本(-h 输出)、错误信息、退出码均对照 pacman 7.x 官方源码逐条实现 (对照参考为 gitlab.archlinux.org/pacman/pacman 的公开源码,本仓库不包含其快照)。

系统要求

  • Windows 10 1709+ / Windows 11
  • winget ≥ 1.4(App Installer 自带)
  • Windows PowerShell 5.1 或 PowerShell 7+(可选,pacman.cmd 会自动优先使用 pwsh)

安装

方式一:MSI 安装包(推荐)——直接双击 dist\WinPac-<版本>-x86.msi,或:

msiexec /i dist\WinPac-1.0.0-x86.msi

MSI 为单包双上下文授权(ALLUSERS=2 + MSIINSTALLPERUSER=1):普通用户权限安装 即为每用户安装(无需 UAC);以管理员身份安装则为全机安装。安装后同样需要 打开新的终端窗口让 PATH 生效。卸载走"设置 → 应用"或 msiexec /x。 已知限制:MSI 卸载后可能在用户 PATH 中残留一个指向已删除目录的空条目 (无害;需要绝对干净可改用下方 uninstall.ps1)。

方式二:脚本安装——

git clone <本仓库> winpac
cd winpac
powershell -NoProfile -ExecutionPolicy Bypass -File install.ps1

安装脚本会把 pacman.cmd + pacman.ps1 复制到 %LOCALAPPDATA%\Programs\WinPac 并加入用户 PATH。 打开新的终端窗口,然后:

pacman -V

卸载:powershell -File uninstall.ps1。

也可以不做安装,直接在仓库目录里运行 .\pacman.ps1 或 .\pacman.cmd。

命令映射总表

pacman 命令 实际执行 说明
pacman -Ss <词> winget search <词> 搜索远程仓库;输出格式仿 pacman(repo/Id 版本 + 缩进描述行),已安装的标记 [installed];支持正则(winget 子串搜索无结果且含正则元字符时自动回退全表正则过滤)
pacman -S <pkg> winget install <pkg> 安装;先显示 Packages (N) 摘要并询问 Proceed with installation? [Y/n]
pacman -S --needed <pkg> winget install <pkg> 已装且最新则输出 warning: xxx is up to date -- skipping(跳过重装)
pacman -S <pkg>(已安装) 自动追加 --force 重装 模拟 pacman 的重装语义,输出 warning: xxx is already installed -- reinstalling
pacman -Si <pkg> winget show <pkg> 查看远程包信息
pacman -Sl [repo] winget search [--source repo] 列出仓库内容;repo 仅接受 winget / msstore,否则报 error: repository 'x' not found
pacman -Sy winget source update 刷新软件源
pacman -Su / pacman -Syu winget source update + winget upgrade --all --include-unknown 全系统升级
pacman -Sw <pkg> winget download <pkg> 只下载不安装(确认提示 Proceed with download?)
pacman -Sc / -Scc 删除 %TEMP%\WinGet 安装包缓存(-Scc 另清理 winget LocalCache) 交互与 pacman 一致:-Sc 默认 Y,-Scc 默认 N
pacman -R <pkg> winget uninstall <pkg> 卸载;checking dependencies... + Do you want to remove these packages? [Y/n]
pacman -Rns <pkg> winget uninstall <pkg> -n/-s/-c/-u/-d 被接受但忽略(winget 无依赖图),给出警告
pacman -Q winget list 列出已安装
pacman -Q <pkg> 表内精确匹配 未找到时报 error: package 'x' was not found
pacman -Qq 输出包 Id 仿 pacman -Qq 只输出名字
pacman -Qi <pkg> winget show <pkg> 查看已装包信息
pacman -Qs <正则> winget list + 本地正则过滤 输出 local/Id 版本 + 缩进描述行
pacman -Qu winget upgrade 列出可升级的包
pacman -Qm winget list 中无 Source 的行 "外来"包(非 winget/msstore 安装的程序)
pacman -Qn winget list 中有 Source 的行 "原生"包
pacman -Qp <file> winget show --manifest <file> 查询本地清单文件
pacman -T <pkg>... 逐个对照 winget list 缺失的打印名字并 exit 127(与 pacman 一致,可供脚本检查依赖)
pacman -U <pkg.msix> Add-AppxPackage <pkg.msix> 安装本地 MSIX 包(也支持 .appx / .appxbundle)
pacman -U <目录> winget install --manifest <目录> 安装本地 winget 清单目录
pacman -V / pacman -h / pacman -Sh … — 与 pacman 相同的版本横幅和帮助文本
--noconfirm --accept-package-agreements --accept-source-agreements --disable-interactivity 免交互
--debug --verbose-logs
-p / --print 只打印目标,不执行 与 pacman 一致
pacman -S pkg1 pkg2 - < list.txt 从 stdin 读取目标 与 pacman 一致(重定向时)

不支持的 pacman 功能(调用时报 pacman 风格错误):-D、-F、-Ql、-Qo、-Qk、 -Qc、-Sg/-Qg —— winget 不维护包的文件清单、分组、changelog 和依赖图, 这些没有诚实映射就明确报错,而不是给出误导性输出。

已知差异(设计取舍)

  • 依赖解析:winget 没有依赖图,所有依赖相关旗标(-Sd、-Rs、-Rns…)接受但忽略并警告。
  • -Su 细节:pacman -Syu <pkg> 会先 winget upgrade --all 再逐个安装目标包。
  • 包名约定:pacman 风格输出中用 winget 的 Id(如 Git.Git)对应 pacman 的包名, Name 作为描述行。
  • 已装标记:-Ss 的 [installed] 通过比对 winget list 获得,会多一次查询。
  • 本地化输出:winget 表头为非英文(如中文「名称/ID/版本」)时按列位置解析, -Ss/-Qq/-Qs/-Qm/-Qn/-T 等解析型命令在本地化系统上同样工作;调用 winget 时 一律按 UTF-8 解码(winget ≥ 1.4 恒定输出 UTF-8)。
  • MSI 卸载残留:通过 msiexec 卸载 MSI 时,Windows Installer 不会移除它写入 的用户 PATH 条目(msi/winpac.wxs.in 与 wixl 构建版行为一致),残留条目指向 已删除的目录、无害;需要干净移除请用 uninstall.ps1。
  • 权限:不像 pacman 要求 root,winget 自行处理每用户/每机器安装与 UAC 弹窗。

项目结构

winpac/
├── pacman.ps1        主程序:参数解析(仿 pacman.c 的 getopt 逻辑)+ winget 映射
├── pacman.cmd        cmd 垫片:让 cmd / PowerShell / Windows Terminal 都能用 pacman
├── install.ps1       安装到 %LOCALAPPDATA%\Programs\WinPac 并加 PATH
├── uninstall.ps1     卸载
├── msi/              MSI 安装包构建
│   ├── build.ps1     Windows 构建(WindowsInstaller COM + makecab,零依赖、免管理员)
│   ├── build.sh      Linux 构建(wixl / msitools,用于 CI)
│   ├── winpac.wxs.in MSI 定义源文件(两种构建共用同一布局)
│   └── winpac.ico    产品图标
├── dist/             构建产物(WinPac-<版本>-x86.msi)
├── tests/run-tests.ps1  干跑测试套件(无需 Windows)
└── README.md

开发与测试

设置 WINPAC_DRY_RUN=1 后,所有 winget 调用只打印不执行,并用内置的模拟表驱动 -Q/-Ss 等解析逻辑,因此整套测试在任何装有 PowerShell 的系统上都能跑:

pwsh -NoProfile -File tests/run-tests.ps1   # 81 项断言

构建 MSI(版本号取自 pacman.ps1 的 $script:VERSION,单一事实来源):

pwsh -NoProfile -File msi/build.ps1          # Windows:输出 dist/WinPac-<版本>-x86.msi
bash msi/build.sh                            # Linux:wixl 构建等价 MSI

主程序兼容 Windows PowerShell 5.1(未使用三元运算符、?? 等 7.x 专属语法)。

许可

MIT(见 LICENSE)。pacman 语法与文案的对照实现参考了 pacman(GPL-2.0)的公开源码, 本项目不包含其代码。

About

将Arch的Pacman迁移到Windows(Winget后台)

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages