sundry 是一个 WinGet 本地清单管理工具,让您更方便地移除清单、修改清单,还可以辅助更新清单。
- 前往 GitHub Release 页面下载安装程序或 zip/7z 归档。
- 使用 WinGet 获取:
winget install --id DuckStudio.Sundry --source winget --exact
从源构建。
当您获取本工具后,请先使用这个命令初始化配置文件:
sundry config init
题外话: 这个配置文件就是我将其从我自己的工具变为这里的工具的方法 XD
Tip
在 1.1.0 之前,配置文件在程序目录下的 config.json
中;在 1.1.0 之后,配置文件在用户目录下的 .config/DuckStudio/Sundry/config.json
中。 - 这是为更新时不覆盖配置文件考虑的,如果配置文件不对,请再次使用 sundry config init
。
由于作者实在是太懒了,在卸载 Sundry 之后不会移除配置文件,如果需要可以手动移除。
初始化完配置文件后用以下命令确认下:
sundry config show
如果有任何地方不对,请使用这个命令修改对应键的值:
sundry config "<条目>" "<值>"
更多可用命令请见下方示例。
sundry remove
截图来自拉取请求: microsoft/winget-pkgs#265074
- 别名:
移除
,remove
- 作用: 移除一个指定的软件包的指定版本,并在移除前自动检查该版本是否确实存在问题。可以指定理由或跳过自动检查。默认理由为“安装程序URL在GitHub Action上返回了404”。
- 用法:
sundry remove <软件包标识符> <软件包版本> [是否跳过自动检查] [理由]
- 示例:
- 最少参数:
sundry remove DuckStudio.FufuTools 1.3.10
- 跳过自动检查:
sundry remove DuckStudio.FufuTools 1.3.10 True
- 指定理由:
sundry remove DuckStudio.FufuTools 1.3.10 "该版本存在一个已知问题"
- 指定理由的同时跳过自动检查:
sundry remove DuckStudio.FufuTools 1.3.10 True "该版本存在一个已知问题"
- 最少参数:
sundry autoremove
- 别名:
自动移除
,autoremove
- 作用: 自动检查并移除指定软件包标识符下的失效版本。
- 用法:
sundry autoremove <软件包标识符>
- 示例:
sundry autoremove DuckStudio.Sundry
[!WARNING] 她不会检查清单中的所有
InstallerUrl
,而是仅使用 WinGet 验证适合自己设备的安装程序是否有效。例如您在一个 x86 设备上尝试autoremove
一个仅 x64 的软件包,则可能出现误判。
我知道这不是一个好方法,我已在 Sundry-Locale 上着手修改检查逻辑。
sundry modify
- 别名:
单改
,单修改
,modify
- 作用: 修改一个指定的软件包的指定版本的清单,并在修改完后自动提交拉取请求。
- 用法:
sundry modify <软件包标识符> <版本> [理由/解决的议题]
- 示例:
- 最少参数:
sundry modify XBMCFoundation.Kodi 18.2.0.0
(microsoft/winget-pkgs#267613) - 指定理由:
sundry modify XBMCFoundation.Kodi 18.3.0.0 "替换 HTTP 为 HTTPS"
(microsoft/winget-pkgs#267614) - 链接议题:
- 使用议题 URL:
sundry modify DuckStudio.Sundry 1.2.6 "https://github.com/microsoft/winget-pkgs/issues/267539"
- 使用议题纯数字编号:
sundry modify DuckStudio.Sundry 1.2.6 "267539"
- 使用议题编号:
sundry modify DuckStudio.Sundry 1.2.6 "#267539"
- 使用议题 URL:
- 指定理由的同时链接议题:
sundry modify DuckStudio.Sundry 1.2.6 "一些修改。 - Resolves https://github.com/microsoft/winget-pkgs/issues/267539"
GitHub Docs: 使用关键词将拉取请求链接到议题
- 最少参数:
sundry logs-analyse
- 别名:
日志分析
,logs-analyse
,logs_analyse
,Azure日志分析
- 作用: 分析 Azure Validation Pipeline Run 失败时的日志,来自动查找具体哪里失败了。
- 用法:
- 分析日志:
sundry logs-analyse <Azure Pipline Url> [是否保留日志文件] [是否显示一般错误/异常]
- 清理之前下载的日志:
sundry logs-analyse cleanup
- 分析日志:
- 示例:
- 分析日志
这里的 Azure Validation Pipeline Run 是 microsoft/winget-pkgs#267849 (comment) 的。
- 最少参数:
sundry logs-analyse "https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=137464"
(需要用户输入) - 不保留日志文件:
sundry logs-analyse "https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=137464" n
- 保留日志文件:
sundry logs-analyse "https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=137464" y
(运行后将打开日志文件所在目录) - 不显示一般错误/异常: 默认,不需要传递额外参数。
- 显示一般错误/异常:
sundry logs-analyse "https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=137464" 占位 y
- 保留日志文件且不显示一般错误/异常: 默认不显示一般错误/异常,同保留日志文件的示例。
- 保留日志文件且显示一般错误/异常:
sundry logs-analyse "https://dev.azure.com/shine-oss/8b78618a-7973-49d8-9174-4360829d979b/_build/results?buildId=137464" y y
- 最少参数:
- 清理之前下载的日志:
sundry logs-analyse cleanup
(等效于sundry cleanup logs-analyse
)
- 分析日志
sundry verify
截图是在 Hyper-V Windows 10 x64 虚拟机上的测试。
- 别名:
verify
,test
,验证
,测试
- 作用: 用于测试本地或 PR 上的清单的安装和卸载,并获取 ARP 条目变更。
- 用法:
- 本地仓库清单:
sundry verify <软件包标识符> <软件包版本>
- 指定清单文件夹:
sundry verify <清单文件夹路径>
- PR 清单:
sundry verify <PR链接>
- 本地仓库清单:
- 示例:
- 测试本地仓库清单:
sundry verify DuckStudio.FufuTools 1.3.10
- 测试指定清单文件夹:
sundry verify D:/WinGet/Manifests/DuckStudio/FufuTools/1.3.10/
- 测试 PR 清单:
sundry verify <打开的PR>
- 测试本地仓库清单:
[!WARNING]
- 它只能获取 HEAD 分支没被删除的 PR 的清单,如果 HEAD 分支被删除了 GitHub API 会响应 404 Not Found。
- 它暂时无法获取
UpgradeCode
。
sundry ignore
- 别名:
忽略
,检查忽略
,ignore
- 作用: 管理 winget-tools 中的检测脚本的忽略字段。
- 用法:
sundry ignore <add/remove/edit/list> [忽略字段] [理由]
- 示例:
- 添加忽略字段:
sundry ignore add "https://www.argyllcms.com/" "服务器冲不动咖啡 (418)"
- 移除忽略字段:
sundry ignore remove "https://www.argyllcms.com/" "又冲得动了"
- 编辑忽略字段:
sundry ignore edit
- 列出所有忽略字段:
sundry ignore list
- 添加忽略字段:
sundry cat
- 别名: 没有别名,只能用
cat
。 - 作用: 获取指定软件包标识符的指定版本的清单,可以指定获取所有清单或某个类型的清单。
- 用法:
sundry cat <软件包标识符> <版本> [清单类型] [区域设置(如果是locale类型)]
- 示例:
- 获取所有清单:
sundry cat DuckStudio.Sundry 1.2.3
- 亦可使用
sundry cat DuckStudio.Sundry 1.2.3 all
- 除
all
外还可用全部
,所有
- 亦可使用
- 获取指定类型的清单:
- 安装程序清单:
sundry cat DuckStudio.Sundry 1.2.3 i
- 可以用
installer
,安装程序
,安装
,i
- 可以用
- 区域清单:
sundry cat DuckStudio.Sundry 1.2.3 l zh-CN
- 可以用
locale
,区域
,区域设置
,l
- 必须指定具体哪个区域设置的清单
- 可以用
- 版本清单:
sundry cat DuckStudio.Sundry 1.2.3 v
- 可以用
version
,ver
,v
,版本
- 可以用
- 安装程序清单:
- 获取所有清单:
sundry prune
- 别名: 没有别名,只能用
prune
。 - 作用: 清理仓库远程已删除的分支。
- 等效于:
cd $winget_pkgs git remote prune origin cd $winget_tools git remote prune origin
- 等效于:
- 用法:
sundry prune
- 示例:
sundry prune
sundry sync
- 别名:
sync
,同步
,synchronize
,sync-fork
- 作用: 同步 fork 仓库和上游仓库的修改。
- 用法:
sundry sync
- 示例:
sundry sync
sundry repr
- 别名: 没有别名,只能用
repr
。 - 作用: 等效于 Python 的
repr()
,用于获取字符串真实的样子。 - 用法:
sundry repr <文件路径/文本内容> [编码(默认 UTF-8)]
- 示例:
- 文本:
sundry repr "第一行 第二行"
- 文件 (假设编码为 gbk):
sundry repr "D:/文件路径/文件.txt" "gbk"
- 文本:
sundry config
- 别名:
config
,配置
- 作用: 初始化和修改 Sundry 配置。
- 用法:
sundry config <参数...>
- 示例:
- 初始化配置:
sundry config init
- 显示当前配置:
sundry config show
- 修改配置项:
sundry config signature no
- 初始化配置:
sundry revert
- 别名:
还原
,revert
- 作用: 还原本地仓库的修改,如果 Sundry 在修改的某个过程中崩溃了,则可以使用此命令还原 Sundry 做的修改。
- 用法:
sundry revert <仓库> <是否已提交> <是否丢弃>
- 示例:
- 还原所有仓库、未提交、丢弃:
sundry revert all n y
- 其他类似
- 还原所有仓库、未提交、丢弃:
sundry fun
- 别名: 没有别名,只能用
fun
。 - 作用: 管理 Sundry 的
fun.txt
。 - 用法:
sundry fun <random/list/edit/add/remove/import> [参数...]
- 示例:
- 随机一个:
sundry fun
或sundry fun random
- 还可以使用
sundry fun 随机
- 还可以使用
- 列出所有:
sundry fun list
- 可以用
获取
,读取
,get
,list
- 可以用
- 编辑 fun.txt:
sundry fun edit
- 可以用
编辑
,edit
,打开
,open
- 可以用
- 添加新的:
sundry fun add "提问: 罗浮六御中谁最幸福? 答案: 符玄。因为她姓符。"
- 可以用
add
,添加
- 可以用
- 移除原来的:
sundry fun remove "Ciallo~(∠・ω< )⌒☆"
- 可以用
remove
,移除
- 可以用
- 从其他文件导入(覆盖):
sundry import "D:/文件路径/另一个fun.txt"
- 可以用
import
,导入
- 可以用
- 随机一个:
sundry cleanup
- 别名:
清理
,cleanup
- 作用: 清理 Sundry 的各个工具运行时产生的文件。
- 用法:
sundry cleanup <工具名>
- 可以被清理的工具有
logs-analyse
,autoremove
,remove
,verify
; 您还可以使用all
来清理所有工具产生的文件。
- 可以被清理的工具有
- 示例:
- 清理所有:
sundry cleanup
(等效于sundry cleanup all
) - 清理指定工具:
sundry cleanup logs-analyse
(等效于sundry logs-analyse cleanup
)
- 清理所有:
命令 | 是否支持 | 备注 |
---|---|---|
help | ✓ | |
ver | ✓ | |
remove | ✕ | 验证阶段需要 WinGet,不确定如何读取 Token |
autoremove | ✕ | 验证阶段需要 WinGet,移除版本依赖 remove 命令 |
modify | ✕ | 验证清单需要 WinGet,不确定如何读取 Token |
logs-analyse | 部分支持 | 不支持自动打开日志文件夹 |
verify | ✕ | 您只能在 Windows 上验证软件包 |
ignore | ✕ | 不确定如何读取 Token |
cat | ✓ | |
sync | ✓ | |
prune | ✓ | |
repr | ✓ | |
config | ✓ | |
revert | ✓ | |
fun | ✓ | |
cleanup | ✓ |
Tip
仓库下有一个适用于 Windows 的构建流,你可以 fork 后直接运行,它会将结果上传为工件。
- 克隆后
cd
到项目所在目录 - 更新代码中的版本号
python "自动化脚本/修改版本号.py" "2025.520.1314"
- 安装依赖
python -m venv .venv
& ".venv\Scripts\Activate.ps1"
python.exe -m pip install --upgrade pip
pip install -r "requirements.txt"
- 转换图标格式 (可选)
python "自动化脚本/png-2-ico.py"
- 构建
pyinstaller --onefile --distpath="Release" --name="sundry.exe" "src/sundry.py" --icon "icon/Sundry.ico"
# 如果前面没转换图标格式,参数中的图标请用 icon/Sundry.png,Pyinstaller 会尝试自己转换格式。
- 复制所需文件
Copy-Item -Path "src/fun.txt" -Destination "Release" -Verbose
Copy-Item -Path "LICENSE" -Destination "Release" -Verbose
Release
下就是构建结果
set -e
echo "克隆源码..."
git clone https://github.com/DuckDuckStudio/Sundry.git
cd Sundry
echo "创建虚拟环境并安装依赖..."
python3 -m venv .venv
source .venv/bin/activate
pip install -r "requirements.txt"
echo "构建二进制文件..."
python3 "自动化脚本/修改版本号.py" "2025.520.1314"
pyinstaller --onefile --distpath="Release" --name="sundry" "src/sundry.py"
deactivate
cp -v "src/fun.txt" "Release"
cp -v "LICENSE" "Release"
echo "整理文件..."
cd ..
cp -rv "Sundry/Release" "./Release"
rm -rvf Sundry
cd Release
echo "配置 Sundry..."
./sundry ver
./sundry config init
然后 ./Release
下就是构建结果。