App-Store-Connect-CLI 的 WinGet 打包与发布自动化指南:让 `winget install asc` 真正可用
【免费下载链接】App-Store-Connect-CLIFast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more项目地址https://gitcode.com/gh_mirrors/ap/App-Store-Connect-CLI点击查看免费下载导读本文基于 docs/WINGET.md 展开围绕 App-Store-Connect-CLI命令行工具asc在 Windows 平台上通过 WinGetWindows Package Manager分发的完整流程从包标识设计与首批清单文件的编写到 release.yml 中自动向 microsoft/winget-pkgs 提交 PR 的发布流水线再到安装验收与故障恢复策略。读完本文你将掌握如何为任意版本生成三份 WinGet 清单、如何配置并理解自动提交的重试与幂等机制以及如何在干净 Windows 机器上完成从安装到卸载的端到端验收。背景为什么需要 WinGet 打包asc是面向 App Store Connect API 的命令行工具官方推荐安装方式在 README.md 中有清晰分层macOS 上优先brew install ascmacOS/Linux 可用安装脚本而 Windows 用户的目标安装命令就是winget install asc要让这条命令真正生效需要满足两个条件包必须被 microsoft/winget-pkgs 社区仓库收录——WinGet 默认源只接受托管在该公共仓库中的清单包必须有明确的 Monikerasc——winget install asc正是靠 Moniker 把简写命令解析到具体包。由于清单仓库独立于本仓库App-Store-Connect-CLI 采用自动生成清单 自动提交 PR的方式来完成分发这正是 docs/WINGET.md 记录的核心流程。WinGet 包的跟踪与讨论记录于项目内的 GitHub Discussion #1552在包被接受并出现在winget search asc之前Windows 用户仍可直接下载 GitHub Releases 页的签名二进制。包标识Moniker、Identifier 与 Commands 的设计向 microsoft/winget-pkgs 提交时使用的包身份定义如下PackageIdentifier: Rorkai.ASC PackageName: asc Moniker: asc Commands: - asc各字段的职责在发布流程中各不相同Moniker: asc这是winget install asc能解析到本包的关键。当输入无歧义时WinGet 会通过 Moniker 匹配用户输入一旦出现同名竞争包WinGet 会弹出歧义选择提示。PackageIdentifier: Rorkai.ASC稳定、无歧义的自动化标识。脚本化安装时应始终使用它避免歧义提示打断 CIwinget install --id Rorkai.ASC --exactCommands: [asc]声明安装后注册的命令名WinGet 会用它做后续的命令解析与卸载关联。这与仓库里 PowerShell 补全、任务提示等以asc为单一入口的设计保持一致。这一Moniker 面向交互、Identifier 面向脚本的双轨设计也体现在 README.md 的安装段落里交互用户用短命令自动化脚本用精确 ID。首次提交三份清单文件详解WinGet 清单ManifestVersion 1.6.0由三份 YAML 组成App-Store-Connect-CLI 的首次提交以 portable 安装器类型从 Windows 发布资产生成。1. 版本清单versionPackageIdentifier: Rorkai.ASC PackageVersion: 1.5.1 DefaultLocale: en-US ManifestType: version ManifestVersion: 1.6.02. 默认区域清单defaultLocalePackageIdentifier: Rorkai.ASC PackageVersion: 1.5.1 PackageLocale: en-US Publisher: Rorkai PackageName: asc PackageUrl: https://github.com/rorkai/App-Store-Connect-CLI License: MIT LicenseUrl: https://github.com/rorkai/App-Store-Connect-CLI/blob/main/LICENSE ShortDescription: Fast, scriptable CLI for the App Store Connect API. Moniker: asc Tags: - app-store-connect - app-store-connect-api - cli - ios - testflight ReleaseNotesUrl: https://github.com/rorkai/App-Store-Connect-CLI/releases/tag/1.5.1 ManifestType: defaultLocale ManifestVersion: 1.6.0注意ShortDescription与项目描述一致Fast, scriptable CLI for the App Store Connect API.Tags覆盖了 app-store-connect / app-store-connect-api / cli / ios / testflight 五个检索关键词这些都会直接提升winget search的可发现性。3. 安装器清单installerPackageIdentifier: Rorkai.ASC PackageVersion: 1.5.1 InstallerType: portable Commands: - asc Installers: - Architecture: x64 InstallerUrl: https://github.com/rorkai/App-Store-Connect-CLI/releases/download/1.5.1/asc_1.5.1_windows_amd64.exe InstallerSha256: REPLACE_WITH_RELEASE_SHA256 ManifestType: installer ManifestVersion: 1.6.0首次提交采用portable便携安装器类型不需要 MSI 安装过程直接落地可执行文件并在 PATH 中注册asc命令与asc自包含二进制无需 Go 运行环境见 README.md的交付形态完全匹配。安装器 URL 指向 GitHub Releases 的 Windows amd64 资产asc_version_windows_amd64.exeInstallerSha256必须替换为该资产的实际 SHA256。生成器源码generate_winget_manifests.py 如何工作三份清单并非手写而是由 scripts/generate_winget_manifests.py 程序化生成本地即可复现。脚本核心逻辑如下常量定义scripts/generate_winget_manifests.pyRorkai.ASC、asc、MIT、ManifestVersion1.6.0等打包参数集中管理保证三份清单字段一致版本校验scripts/generate_winget_manifests.py--version必须匹配\d\.\d\.\d纯 semver 格式不允许v前缀不符合直接退出SHA256 提取scripts/generate_winget_manifests.py从asc_version_checksums.txt中按资产名asc_version_windows_amd64.exe取出对应摘要并转大写找不到资产或校验文件缺失都会报错退出——这保证了清单中的哈希永远来自官方发布资产而不是手工填写输出目录结构scripts/generate_winget_manifests.py严格遵循 winget-pkgs 的目录约定manifests/r/Rorkai/ASC/version/文件名分别为Rorkai.ASC.yaml、Rorkai.ASC.locale.en-US.yaml、Rorkai.ASC.installer.yaml。本地为某版本生成清单的命令python3 scripts/generate_winget_manifests.py \ --version 1.5.1 \ --release-dir release \ --output-dir /tmp/asc-winget其中release目录需包含发布资产及asc_1.5.1_checksums.txt。发布侧的校验脚本 scripts/verify_release_assets.py 会先验证校验和清单精确覆盖每一个发布资产不允许缺失、重复或文件外条目生成器读取的哈希因此是有保障的。发布自动化release.yml 中的 winget jobWinGet 清单的生成与提交发生在 .github/workflows/release.yml 的wingetjobL797-L1063中它在 GitHub Release 发布成功后运行与 Homebrew tap 更新并行推进。流水线步骤检出发布源码以发布 tag 为 ref 检出仓库同时以github.workflow_sha检出工作流验证工具避免用最新脚本去处理历史发布下载不可变发布资产从published-release-versionartifact 解包并用verify_release_assets.py验证资产与校验和完整性.github/workflows/release.yml生成清单调用generate_winget_manifests.py --version ${VERSION} --release-dir release --output-dir winget-output.github/workflows/release.yml上传 artifact把manifests/r/Rorkai/ASC/version上传为可下载的构建产物提交 PRfork 并克隆 winget-pkgs把清单复制到分支后通过gh pr create向 microsoft/winget-pkgs 提交 PR.github/workflows/release.yml。必需的仓库配置secrets.WINGET_GITHUB_TOKEN必需一个能对 microsoft/winget-pkgs 创建/使用 fork、向该 fork 推送分支、并向 microsoft/winget-pkgs 打开 PR 的 token。未设置时 job 直接报错退出.github/workflows/release.ymlvars.WINGET_FORK_OWNER可选指定拥有 fork 的组织/用户未设置时回退为 token 认证用户的登录名AUTH_LOGIN.github/workflows/release.yml。重试与幂等设计提交步骤是流水线里最易受网络抖动影响的部分其设计要点全部可在 .github/workflows/release.yml 中验证限流预检先用gh api rate_limit打印 token 的 core/graphql/search 配额快照该调用不消耗配额若发现主配额为 0 会输出警告并提示 reset 时间让后续诊断不再依赖不透明的 gh 报错.github/workflows/release.yml有界重试每个gh/git网络调用都经retry_transient包装默认 5 次尝试、指数退避基数 10s封顶 120s每次退避前加入随机抖动RANDOM % (delay / 2 1)避免 thundering herd只重试瞬时故障is_transient_failure用一组正则精确匹配 GitHub rate limit、abuse detection、HTTP 408/429/5xx、DNS/连接/TLS 超时、curl 传输层错误码等而认证、权限、校验、scope 检查等失败会立即失败不做无谓重试.github/workflows/release.yml克隆与 PR 幂等中断的克隆每次从头开始避免残留半成品目录-B分支检出保证重试不会重复创建分支submit_winget_pr在创建前先按标题和headowner:branch双重查询已有 PR即使上一次创建请求的响应丢失重试也不会开出重复 PR.github/workflows/release.yml。命名与路径约定分支名固定为rorkai-asc-versionwinget-pkgs 中的清单路径为manifests/r/Rorkai/ASC/version/verify_winget_scope会在提交前检查分支 diff 只包含该版本清单目录内的改动杜绝意外污染.github/workflows/release.yml。失败恢复重跑与人工兜底如果 winget job 在重试耗尽后仍然失败按以下顺序恢复直接重跑该 job或对同一版本重新 dispatch 发布工作流。重跑是安全的它复用已发布的 release artifact能识别已存在的rorkai-asc-version分支且已有 PR 时会跳过创建.github/workflows/release.yml若预检显示主配额core/graphql/search为 0等待日志中对应 bucket 的 reset 时间后再重跑若属次级限流、5xx 或传输失败reset 时间与此无关等待几分钟即可重跑仅当重跑因非瞬时原因失败时才回退到人工提交清单此时清单文件可先从 winget-manifests artifact 下载。验收检查从 smoke 工作流到干净机器演练清单 PR 合并且 WinGet 源更新后有两种验收方式。方式一WinGet smoke 工作流仓库内置了 .github/workflows/winget-smoke.ymlWinGet smoke支持手动 dispatch默认参数package_id: Rorkai.ASC、command: asc。它在windows-latest上依次执行输入校验package_id / command 正则winget source update --disable-interactivity刷新源winget search --moniker asc --exact与winget show --id Rorkai.ASC --exact验证可发现性按精确 Moniker 安装随后Get-Command asc解析出可执行文件并运行--help与version验证命令真实可用winget uninstall --id Rorkai.ASC --exact收尾卸载if: always()保证即使前面失败也尝试清理。所有命令都带--disable-interactivity保证在 CI 环境下无人值守运行。方式二干净 Windows 机器手动验证在全新 Windows 环境执行winget source update winget search asc --source winget winget install asc --source winget --accept-source-agreements --accept-package-agreements asc --help asc version winget uninstall --id Rorkai.ASC --exact若winget install asc弹出歧义选择同名包竞争说明 Moniker 检索不唯一此时应改用文档记录的自动化安全命令winget install --id Rorkai.ASC --exact这也是 README.md 中推荐脚本使用精确 ID 的原因--exact保证任何环境下都不会被交互式提示卡住。小结App-Store-Connect-CLI 的 WinGet 分发是一条本地生成器 发布流水线自动提交 独立 smoke 验收的完整链路generate_winget_manifests.py负责从官方发布资产生成三份标准清单release.yml 的 winget job 以限流感知、有界重试、幂等提交的方式自动向 winget-pkgs 开 PR而 winget-smoke.yml 与手册命令共同保证winget install asc从安装、运行到卸载的全流程可靠。理解这套机制后无论是首次提交、版本升级还是 CI 失败后的恢复都能按文档化的步骤稳步推进。相关参考文件docs/WINGET.md本文主文档scripts/generate_winget_manifests.py清单生成器.github/workflows/release.yml发布自动提交流水线.github/workflows/winget-smoke.ymlWinGet 冒烟验收scripts/verify_release_assets.py发布资产校验README.mdWindows 安装命令与回退说明赞分享【免费下载链接】App-Store-Connect-CLIFast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more项目地址https://gitcode.com/gh_mirrors/ap/App-Store-Connect-CLI点击查看免费下载相关推荐Radare2 Windows Winget 打包与发布指南从本地构建到 winget-pkgs 提交Radare2 Windows Winget 打包与发布指南从本地构建到 winget pkgs 提交 Radare2r2是一个面向类 Unix 系统的开逆向工程网络安全GeoLibre Desktop MSIX 打包指南从 winget 直装包到 Microsoft Store 提交GeoLibre Desktop MSIX 打包指南从 winget 直装包到 Microsoft Store 提交 本文聚焦 GeoLibre 项目中的 MGIS数据可视化前端桌面应用后端winget-install完全指南如何用PowerShell一行命令自动安装WinGet包管理器前置依赖全部搞定winget install完全指南如何用PowerShell一行命令自动安装WinGet包管理器前置依赖全部搞定 winget install 是一个开源开发工具CLI上一篇Friend Windows 版「记忆、用户画像与 Persona」Mac 对齐审计深度解析持续记忆提取、AI 用户画像与嵌入索引的完整实现下一篇突破传统Vue-YDUI重新定义移动端开发的终极武器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考