开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载swift package-collection add是 Swift Package ManagerSwiftPM内置的swift package-collection命令行工具族中的核心子命令用于把一个托管在 Web 上要求 HTTPS或本地文件系统中的**包集合package collection**导入到用户的配置中。本文以官方文档 PackageCollectionAdd.md 为骨架结合仓库源码深入讲解该命令的完整用法、签名与信任模型、全部命令行参数以及底层实现原理。读完本文你将能够熟练添加各类来源的包集合、正确处理签名校验的四种错误场景、配置受信任根证书并理解--trust-unsigned与--skip-signature-check两个标志的真实作用边界。什么是包集合包集合Package Collection是由 SE-0291。swift package-collection命令从 Swift 5.5 起可用包含六个子命令add添加一个新集合describe获取集合或集合内某个包的元数据list列出已配置的集合refresh刷新已配置的集合remove移除一个已配置的集合search在已导入的集合中按关键词或模块名搜索包从命令实现源码 PackageCollectionsCommand.swift 可以看到PackageCollectionsCommand通过 ArgumentParser 声明了commandName: package-collection并注册了上述六个子命令其中Add是本文的主角。添加包集合的基本用法add子命令的核心功能是添加一个新的包集合。包集合可以来自两种位置方式一托管在 Web 上必须使用 HTTPS$ swift package-collection add https://www.example.com/packages.json Added Sample Package Collection to your package collections.方式二位于本地文件系统使用file://协议$ swift package-collection add file:///absolute/path/to/packages.json Added Sample Package Collection to your package collections.命令成功后会在终端输出Added 集合名称 to your package collections.。这一输出在源码 PackageCollectionsCommand.swift 中对应实现为print(Added \\(collection.name)\ to your package collections.)从源码 PackageCollectionsCommand.swift 可以看出命令入口对 URL 做了容错解析优先用URL(string:)解析若失败且字符串以file://开头则回退到URL(fileURLWithPath:)构造本地文件 URL该实现还能正确处理路径中的空格。这也解释了为什么本地路径必须显式写出file://前缀。通过 order 控制排序可选参数order是一个排序提示用于调整该集合在用户集合列表中的位置并可能影响搜索结果中的排名。默认情况下新集合被追加到列表末尾即相关度最低的位置这一点在 API.swift 的addCollection接口注释中有明确说明。$ swift package-collection add https://www.example.com/packages.json --order 1 Added Sample Package Collection to your package collections.添加成功后配置存放在哪里添加的集合会持久化到 SwiftPM 的配置目录中。官方文档 PackageCollections.md 明确指出与包集合相关的配置存放在~/.swiftpm/config/collections.json文件中它记录用户的集合清单以及--trust-unsigned、--skip-signature-check等偏好设置。该文件由 SwiftPM 命令负责管理不期望用户手工编辑。底层路径的计算逻辑位于 FileSystemExtensions.swiftswiftPMConfigurationDirectory优先返回用户配置目录下的configuration子目录符合 XDG 规范的位置否则回退到~/.swiftpm/configuration。也就是说不同平台上实际的配置根目录可能不同但语义一致。签名包集合Signed package collections包集合的发布者可以选择对集合签名以保护其内容不被篡改。SwiftPM 在导入一个已签名的集合之前会先校验其签名是否有效。签名机制及证书要求的完整说明见 PackageSecurity.md 中的 Signed package collections 一节。签名无效时的处理如果校验失败命令会返回如下错误$ swift package-collection add https://www.example.com/bad-packages.json The collections signature is invalid. If you would like to continue please rerun command with --skip-signature-check.用户可以选择终止操作也可以选择尽管签名无效仍然继续添加此时需要显式传入--skip-signature-check标志$ swift package-collection add https://www.example.com/packages.json --skip-signature-check需要特别注意的是--skip-signature-check只是跳过对已签名集合的签名校验它对未签名集合没有任何效果见下文未签名包集合一节。从源码层面看这条错误信息在 PackageCollectionsCommand.swift 中定义为CollectionsError.invalidSignaturecase .invalidSignature: return The collections signature is invalid. If you would like to continue please rerun command with --skip-signature-check.它在命令执行流程中由底层PackageCollectionError.invalidSignature映射而来PackageCollectionsCommand.swift。缺少必需签名时的处理对于托管在 Web 上的集合发布者可以通过证书固定certificate-pinning配置要求 SwiftPM强制校验签名详见 PackageSecurity.md。如果某个集合本应签名却没有签名用户会看到如下错误$ swift package-collection add https://www.example.com/bad-packages.json The collection is missing required signature, which means it might have been compromised.在这种情况下用户不应继续添加该集合因为这意味着集合内容可能已被篡改。这条消息对应源码中的CollectionsError.missingSignaturePackageCollectionsCommand.swift。底层的判定逻辑在 JSONPackageCollectionProvider.swift当 JSON 解码为SignedCollection失败说明集合没有签名时如果sourceCertPolicy.mustBeSigned(source:)返回true即该域名被证书策略要求必须签名就直接抛出PackageCollectionError.missingSignature。签名校验的源码级流程在 JSONPackageCollectionProvider.swift 的decodeAndRunSignatureCheck方法中可以完整还原签名校验的决策树先尝试把响应体解码为SignedCollection若解码失败说明集合未签名——此时若该域名策略要求必须签名则报missingSignature否则按未签名集合处理若解码成功集合已签名且source.skipSignatureCheck true则跳过校验将签名标记为isVerified false若平台不支持签名校验isSignatureCheckSupported false抛出 Unsupported platform否则进入真正的校验对每个证书策略键并发执行signatureValidator.validate(...)只要有一个校验通过即返回已验证的集合校验失败时如果底层错误是PackageCollectionSigningError.noTrustedRootCertsConfigured即没有任何受信任根证书可用映射为cannotVerifySignature否则映射为invalidSignature。此外该 Provider 对 Web 集合还先发送 HEAD 请求检查Content-Length超过maximumSizeInBytes默认 5 MB见 JSONPackageCollectionProvider.swift会直接拒绝这是对恶意超大响应的一种防御responseTooLarge。受信任根证书Trusted root certificates签名校验是证书链校验的一部分SwiftPM 需要确认签名证书的根证书是受信任的。如果缺少可用的受信任根证书校验将无法进行报错如下$ swift package-collection add https://www.example.com/packages.json The collections signature cannot be verified due to missing configuration.如何显式信任某个发布者用户可以通过获取发布者的根证书并保存到~/.swiftpm/config/trust-root-certs来显式声明信任该发布者及其发布的所有集合。注意根证书必须是DER 编码的由于 SwiftPM 信任根证书之下的所有证书链因此取决于已安装的根证书部分发布者可能已经被隐式信任无需用户逐个显式指定。底层实现上签名校验器在 JSONPackageCollectionProvider.swift 中初始化其受信任根证书目录指向swiftPMConfigurationDirectory.appending(trust-root-certs)并会叠加来自证书固定策略sourceCertPolicy.allRootCerts的根证书。也就是说受信任根证书的来源有三类操作系统预装的根证书仅 Apple 平台、~/.swiftpm/config/trust-root-certs目录下的证书所有平台、随证书固定配置内置的根证书。发布者应当把自己的 DER 编码根证书做成可下载资源以便用户按需配置参见 PackageSecurity.md。cannotVerifySignature这条错误在 PackageCollectionsCommand.swift 中的完整文案为case .cannotVerifySignature: return The collections signature cannot be verified due to missing configuration. Please refer to documentations on how to set up trusted root certificates or rerun command with --skip-signature-check.提示了两条出路配置受信任根证书或者用--skip-signature-check跳过校验。签名相关的主要错误码一览在 API.swift 中定义了底层的PackageCollectionError枚举与命令层错误一一对应底层错误PackageCollectionError触发场景命令层提示trustConfirmationRequired集合未签名且没有用户信任选择的记录提示使用--trust-unsigneduntrusted集合未签名用户显式标记不信任同上cannotVerifySignature没有受信任根证书证书链无法校验提示配置根证书或--skip-signature-checkinvalidSignature签名校验失败提示使用--skip-signature-checkmissingSignature策略要求签名但集合未签名提示集合可能被篡改不应继续未签名包集合Unsigned package collections对集合进行签名是可选的参见 PackageCollections.md。当尝试添加一个未签名的包集合时SwiftPM 会要求用户先确认信任否则报错$ swift package-collection add https://www.example.com/packages.json The collection is not signed. If you would still like to add it please rerun add with --trust-unsigned.要继续添加用户必须传入--trust-unsigned标志以表明信任$ swift package-collection add https://www.example.com/packages.json --trust-unsigned命令源码中的信任确认流程在 PackageCollectionsCommand.swiftaddCollection会接收一个trustConfirmationProvider闭包命令层直接把--trust-unsigned的值作为回调结果传入若底层抛出trustConfirmationRequired或untrusted则转换为上述unsigned错误文案PackageCollectionsCommand.swift。再次强调两个标志的分工--trust-unsigned信任未签名集合允许添加--skip-signature-check跳过已签名集合的签名校验。--skip-signature-check对未签名集合不起作用——未签名集合必须用--trust-unsigned才能添加。签名与安全风险边界在 PackageCollections.md 中官方还明确列出了签名机制无法防御的两类攻击签名剥离Signature stripping攻击者移除签名使已签名集合以未签名形态下载从而绕过签名检查。防御手段是发布者公开声明集合已签名用户在添加理应签名的集合时若看到未签名警告应立即中止。签名替换Signature replacement攻击者篡改集合后用不同证书重新签名只要签名有效 SwiftPM 就会接受。防御手段是证书固定certificate-pinning配置将签名证书限制到特定主体。证书固定配置由发布者在 PackageCollectionsCertificatePolicy.swift 的defaultSourceCertPolicies字典中添加条目键为集合 URL 的 host可同时指定certPolicyKey签名证书必须满足的主体条件如subjectUserID或appleSwiftPackageCollection(subjectOrganizationalUnit:)与base64EncodedRootCertsDER 根证书的 Base64 编码列表。仓库中developer.apple.com域名已内置了 Apple 系列根证书作为示例。由于证书固定与 Web 域名绑定它仅对https://托管的集合生效不覆盖file://本地文件。add 命令完整参数参考swift package-collection add的完整用法如下来自 PackageCollectionAdd.md与swift package-collection add --help输出一致package-collection add collection-url [--orderorder] [--trust-unsigned] [--skip-signature-check] [--package-pathpackage-path] [--cache-pathcache-path] [--config-pathconfig-path] [--security-pathsecurity-path] [--scratch-pathscratch-path] [--swift-sdks-pathswift-sdks-path] [--toolsettoolset...] [--pkg-config-pathpkg-config-path...] [--enable-dependency-cache] [--disable-dependency-cache] [--enable-build-manifest-caching] [--disable-build-manifest-caching] [--manifest-cachemanifest-cache] [--enable-experimental-prebuilts] [--disable-experimental-prebuilts] [--verbose] [--very-verbose|vv] [--quiet] [--color-diagnostics] [--no-color-diagnostics] [--disable-sandbox] [--netrc] [--enable-netrc] [--disable-netrc] [--netrc-filenetrc-file] [--enable-keychain] [--disable-keychain] [--resolver-fingerprint-checkingresolver-fingerprint-checking] [--resolver-signing-entity-checkingresolver-signing-entity-checking] [--enable-signature-validation] [--disable-signature-validation] [--enable-prefetching] [--disable-prefetching] [--force-resolved-versions|disable-automatic-resolution|only-use-versions-from-resolved-file] [--skip-update] [--disable-scm-to-registry-transformation] [--use-registry-identity-for-scm] [--replace-scm-with-registry] [--default-registry-urldefault-registry-url] [--configurationconfiguration] [--Xcc...] [--Xswiftc...] [--Xlinker...] [--Xcxx...] [--tripletriple] [--sdksdk] [--toolchaintoolchain] [--swift-sdkswift-sdk] [--sanitizesanitize...] [--auto-index-store] [--enable-index-store] [--disable-index-store] [--enable-parseable-module-interfaces] [--jobsjobs] [--use-integrated-swift-driver] [--explicit-target-dependency-import-checkexplicit-target-dependency-import-check] [--build-systembuild-system] [--debug-info-format] [--enable-dead-strip] [--disable-dead-strip] [--disable-local-rpath] [--version] [--help]核心参数详解参数说明collection-url要添加的集合的 URL必填位置参数。--orderorder所添加集合的排序。--trust-unsigned即使集合未签名也信任并添加它。--skip-signature-check若集合已签名跳过其签名校验。--package-pathpackage-path指定要操作的包路径默认当前目录。该参数会在任何其他操作之前更改工作目录。--cache-pathcache-path指定共享缓存目录路径。--config-pathconfig-path指定共享配置目录路径。--security-pathsecurity-path指定共享安全目录路径。--scratch-pathscratch-path指定自定义临时目录路径默认.build。--swift-sdks-pathswift-sdks-path存放已安装 Swift SDK 的目录路径。--toolsettoolset指定构建目标平台时要使用的工具集 JSON 文件可多次指定多个工具集按指定顺序合并成最终工具集。--pkg-config-pathpkg-config-path指定搜索 pkg-config.pc文件的备选路径可多次指定多个路径。--enable-dependency-cache/--disable-dependency-cache是否在获取依赖时使用共享缓存。--enable-build-manifest-caching/--disable-build-manifest-caching是否启用构建清单缓存。--manifest-cachemanifest-cachePackage.swift 清单的缓存模式。合法值shared共享缓存、local包的构建目录、none禁用。--enable-experimental-prebuilts/--disable-experimental-prebuilts是否使用预构建的 swift-syntax 库来处理宏。--verbose提高输出详细程度包含信息性输出。--very-verbose/vv提高输出详细程度包含调试输出。--quiet降低输出详细程度只保留错误输出。--color-diagnostics/--no-color-diagnostics启用或禁用写入 TTY 时的彩色诊断输出。默认连接 TTY 时启用否则禁用。--disable-sandbox执行子进程时禁用沙箱。--netrc即使有其他更优先的凭据存储也使用 netrc 文件。--enable-netrc/--disable-netrc是否从 netrc 文件加载凭据。--netrc-filenetrc-file指定 netrc 文件路径。--enable-keychain/--disable-keychain是否在 macOS 钥匙串中搜索凭据。--resolver-fingerprint-checkingresolver-fingerprint-checking解析器指纹检查策略作用于依赖解析。--resolver-signing-entity-checkingresolver-signing-entity-checking解析器签名实体检查策略作用于依赖解析。--enable-signature-validation/--disable-signature-validation是否校验从 registry 下载的已签名包发布的签名。--enable-prefetching/--disable-prefetching是否启用依赖预取。--force-resolved-versions/--disable-automatic-resolution/--only-use-versions-from-resolved-file只使用 Package.resolved 文件中的版本若其过期则解析失败。--skip-update解析过程中跳过从远端更新依赖。--disable-scm-to-registry-transformation禁用源码控制到 registry 的转换。--use-registry-identity-for-scm在 registry 中查找源码控制依赖尽可能使用其 registry 身份以帮助在两个来源之间去重。--replace-scm-with-registry在 registry 中查找源码控制依赖尽可能用 registry 而非源码控制来获取它们。--default-registry-urldefault-registry-url使用的默认 registry URL替代registries.json配置文件。--configurationconfiguration以指定配置构建如 debug/release。--Xcc把参数透传给所有 C 编译器调用。--Xswiftc把参数透传给所有 Swift 编译器调用。--Xlinker把参数透传给所有链接器调用。--Xcxx把参数透传给所有 C 编译器调用。--tripletriple指定构建目标三元组。--sdksdk指定 SDK。--toolchaintoolchain指定工具链。--swift-sdkswift-sdk过滤以选择要用于构建的特定 Swift SDK。--sanitizesanitize开启运行时检查以捕获错误行为可选值address、thread、undefined、scudo。--auto-index-store/--enable-index-store/--disable-index-store启用或禁用边构建边索引indexing-while-building特性。--enable-parseable-module-interfaces启用可解析模块接口。--jobsjobs构建过程中并行生成的 job 数量。--use-integrated-swift-driver使用集成的 Swift driver。--explicit-target-dependency-import-checkexplicit-target-dependency-import-check指示本次构建应检查目标是否只 import 其显式声明的依赖。--build-systembuild-system指定使用的构建系统。--debug-info-format使用的调试信息格式。--enable-dead-strip/--disable-dead-strip启用/禁用链接器的死代码剥离。--disable-local-rpath禁止默认向 rpath 添加$ORIGIN/loader_path。--version显示版本。--help显示帮助信息。其中与集合本身直接相关的参数只有四个collection-url、--order、--trust-unsigned、--skip-signature-check其余参数均为 SwiftPM 命令共享的全局选项由GlobalOptions注入见 PackageCollectionsCommand.swift。需要注意这些全局选项中有相当一部分如--jobs、--sanitize、--configuration、各类-X*透传参数主要用于构建场景对add这种纯元数据操作不产生实际影响但会在帮助文本中统一列出。结合 libSwiftPM 使用已导入的包集合内容对所有 libSwiftPM 的客户端都可见参见 PackageCollections.md。开发者可以通过PackageCollectionsProtocol定义于 API.swift以库的形式调用同一套能力例如listCollections(identifiers:)列出已配置集合addCollection(_:order:trustConfirmationProvider:)添加集合trustConfirmationProvider即未签名时的信任确认回调getCollection(_:)获取集合信息未配置的集合也会从来源拉取findPackages(_:collections:)/findTargets(_:searchType:collections:)在集合中搜索包或目标。PackageCollections实例的构建需要提供配置目录、缓存目录、文件系统与观测作用域这与 CLI 命令withState中的初始化逻辑一致PackageCollectionsCommand.swift。小结swift package-collection add是使用 SwiftPM 包集合功能的入口命令。实践中的关键要点可以归纳为来源https://Web 地址或file://本地路径排序--order可调整集合在列表与搜索结果中的权重签名集合校验失败时用--skip-signature-check继续不推荐除非来源可信未签名集合需要显式--trust-unsigned确认信任--skip-signature-check对未签名集合无效受信任根证书将发布者的 DER 编码根证书放入~/.swiftpm/config/trust-root-certs实际路径取决于平台的 SwiftPM 配置目录证书链校验才会通过安全边界签名机制无法防御签名剥离与签名替换针对高危域名的强制签名和证书固定由发布者通过证书策略配置实现。对于包集合的创建、发布与安全模型可继续阅读 PackageCollections.md 与 PackageSecurity.md以及同一目录下的describe、list、refresh、remove、search子命令文档。赞分享开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载相关推荐OpenWork Diagnostics 网络诊断服务Vercel 原生 MCP 兼容端点、Connect 调试代理与私有云出口诊断实战指南OpenWork Diagnostics 网络诊断服务Vercel 原生 MCP 兼容端点、Connect 调试代理与私有云出口诊断实战指南 OpenWork开发工具构建工具Swift Package 编辑器命令用 swift package add-dependency / add-target / add-product 自动化编辑 Package.swiftSwift Package 编辑器命令用 swift package add dependency / add target / add product 自动文档Oh My Zsh swiftpm 插件Swift Package Manager 速记别名与 Swift 5.9 补全详解Oh My Zsh swiftpm 插件Swift Package Manager 速记别名与 Swift 5.9 补全详解 本篇指南围绕 Oh My ZshCLI开发工具插件系统上一篇claude-seo 的 Google SEO API 实战指南Search Console、CrUX、PageSpeed、Indexing、GA4 一网打尽下一篇彻底解决MJRefresh不显示问题6个鲜为人知的调试技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考