开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载本指南以 Swift 包管理器SwiftPM官方发布说明 ReleaseNotes/5.5.md 为核心逐条剖析 SwiftPM 5.5 带来的重大变更重点覆盖全新的Package Collections包集合特性含 JSON 格式规范、swift package-collection六个子命令与签名安全机制、可执行目标单元测试能力、两个新的依赖便捷初始化器、单源文件main支持以及二进制依赖解析修复。阅读本文后你将能够使用包集合发现、管理并发布精选包列表编写符合 1.0 格式规范的集合 JSON 文档利用main重构命令行工具源码组织方式并为可执行目标的内部逻辑编写真正的单元测试。一、版本概览与发布背景SwiftPM 5.5 是 Swift 5.5 工具链的重要组成部分。本次发布说明共记录了四大块内容作为头号功能的 Package Collections、测试体系对可执行目标的支持、ManifestPackage.swiftAPI 的两个新便捷初始化器与.product(name:package:)语法改进以及若干问题修复单源文件main与二进制依赖解压修复。值得注意的是本文档作为 SwiftPM 仓库 Sources/PackageManagerDocs/Documentation.docc/ReleaseNotes 目录下的一份版本化文档与同目录的 5.3.md、5.4.md、5.6.md 等共同构成 SwiftPM 各版本能力的连续演进记录可在 ReleaseNotes.md 中总览全部版本条目。二、Package Collections精选包列表的发现、管理与发布2.1 什么是 Package CollectionsPackage Collections 是 SwiftPM 5.5 引入的全新特性对应 PackageCollections.md 文档它允许用户发现、管理并发布经过精选的包列表。一个包集合本质上是一个静态 JSON 文档可以被发布到 Web 或分发到本地文件系统中。包集合的典型使用场景包括教育者与社区贡献者围绕课程资料或博客文章发布配套包集合让读者第一次使用包时就能快速定位到正确的包企业团队提供一份受信任的包清单或维护团队持续使用的一致包集合。SwiftPM 与 Xcode在本地共享同一份包集合数据因此无论是用 SwiftPM 命令行还是 Xcode 图形界面都可以管理用户已添加的集合两个界面看到的状态保持一致。2.2 快速上手订阅 Apple 官方 Swift Packages 集合发布说明给出了两个最直接的命令示例。首先添加订阅Apple 官方的 Swift Packages 集合swift package-collection add https://developer.apple.com/swift/packages/collections/apple.json随后查看该集合中包含哪些包、哪些包现在可以被导入到你的代码中swift package-collection describe https://developer.apple.com/swift/packages/collections/apple.json2.3 package-collection 命令族全景swift package-collection是管理包集合的 CLI 入口见 SwiftPackageCollectionCommands.md共包含六个子命令。导入的包集合内容对所有 libSwiftPM 客户端都是可访问的参见 SwiftPMAsALibrary.md子命令功能对应文档add添加一个新的集合PackageCollectionAdd.mddescribe获取集合或集合内某个包的元数据PackageCollectionDescribe.mdlist列出已配置的集合PackageCollectionList.mdrefresh刷新已配置的集合PackageCollectionRefresh.mdremove移除一个已配置的集合PackageCollectionRemove.mdsearch在已导入的集合中按关键字或模块名搜索包PackageCollectionSearch.mdadd添加集合add支持两类来源HTTPS 托管的 Web 集合与本地文件系统file://URL。同时可选的--order N参数用来指定集合在列表中的排序顺序该顺序可能进一步影响搜索结果的排名# Web 上的集合HTTPS 必需 $ swift package-collection add https://www.example.com/packages.json Added Sample Package Collection to your package collections. # 本地文件系统上的集合 $ swift package-collection add file:///absolute/path/to/packages.json Added Sample Package Collection to your package collections. # 指定排序顺序 $ swift package-collection add https://www.example.com/packages.json --order 1describe查看集合与包元数据describe既能查看集合本身的元数据也能查看集合中某个包的元数据还能通过--version查看特定版本的元数据。所有查询都支持--json输出以便集成到其他工具链# 集合元数据可用于预览尚未添加的集合 $ swift package-collection describe [--json] https://www.example.com/packages.json Name: Sample Package Collection Source: https://www.example.com/packages.json Description: ... Keywords: best, packages Created At: 2020-05-30 12:33 Packages: https://github.com/jpsim/yams ... # 集合内某个包的元数据 $ swift package-collection describe [--json] https://github.com/jpsim/yams Description: A sweet and swifty YAML parser built on LibYAML. Available Versions: 4.0.0, 3.0.0, ... ... Latest Version: 4.0.0 Package Name: Yams Modules: Yams, CYaml Supported Platforms: iOS, macOS, Linux, tvOS, watchOS Supported Swift Versions: 5.3, 5.2, 5.1, 5.0 License: MIT # 特定版本的元数据 $ swift package-collection describe [--json] --version 4.0.0 https://github.com/jpsim/yamslist / refresh / remove集合管理# 列出所有已配置集合 $ swift package-collection list [--json] Sample Package Collection - https://example.com/packages.json ... # 手动刷新所有已配置集合的缓存数据 $ swift package-collection refresh Refreshed 5 configured package collections. # 移除一个集合 $ swift package-collection remove https://www.example.com/packages.json Removed Sample Package Collection from your package collections.关于缓存机制的说明SwiftPM 会在各种条件下自动刷新集合数据但search等查询操作依赖本地缓存因此当集合内容更新后如果搜索不到最新数据可以手动执行refresh强制更新。search按关键字或模块名搜索search支持两种查询模式均可用--json输出# 字符串式搜索按关键字 $ swift package-collection search [--json] --keywords yaml https://github.com/jpsim/yams: A sweet and swifty YAML parser built on LibYAML. ... # 模块名搜索精确匹配模块名 $ swift package-collection search [--json] --module yams Package Name: Yams Latest Version: 4.0.0 Description: A sweet and swifty YAML parser built on LibYAML. -------------------------------------------------------------- ...2.4 包集合的 JSON 数据格式1.0 规范要发布自己的包集合必须遵循规定的数据格式。完整规范见 PackageCollections.md 的 Input Format 小节其数据模型由仓库中的 Sources/PackageCollectionsModel 模块PackageCollectionModelv1.swift定义。顶层元数据字段说明必填name集合显示名称仅用于展示是overview集合的描述否keywords与集合关联的关键字数组否formatVersion集合遵循的格式版本目前仅允许1.0是revision集合的修订号否generatedAt集合生成时间的 ISO 8601 格式日期时间字符串是generatedBy集合作者含name字段否packages包对象组成的非空数组是packages 数组中的包对象字段说明必填url包的 URL目前仅支持 Git 仓库 URL应为 HTTPS 并可含.git后缀是identity包发布到注册中心registry时的身份否summary包描述否keywords包关联的关键字数组否readmeURL包 README 的 URL否license包当前的许可证信息urlnamename优先使用 SPDX 标识符如Apache-2.0、MIT否versions版本对象数组代表包最近/最相关的发布是版本对象字段说明必填version语义化版本字符串是summary该版本的描述否manifests按 Swift tools 版本为键的非空清单映射是defaultToolsVersion默认清单对应的 Swift tools 版本manifests映射的键中必须包含它是verifiedCompatibility已测试验证的兼容平台与 Swift 版本数组平台名可为macOS、iOS、tvOS、watchOS、Linux、Android、WindowsSwift 版本尽量精确到补丁号否license该版本的许可证结构同包级license否author该版本的作者含name否signer该版本的签名者type目前仅允许ADPApple Developer Program另有commonName、organizationalUnitName、organizationName详见 PackageSecurity.md 的包签名章节否createdAt版本创建时间的 ISO 8601 字符串否manifests 映射的结构manifests的值包含toolsVersion清单中指定的 Swift tools 版本packageName包名targets目标数组每项含name与可选的moduleNameproducts产品数组每项含name、type其 JSON 表示必须与 SwiftPM 的PackageModel.ProductType一致与targets该产品的目标数组minimumPlatformVersionsPackage.swift中指定的支持平台数组可选。{ 5.2: { toolsVersion: 5.2, packageName: MyPackage, targets: [ { name: MyTarget, moduleName: MyTarget } ], products: [ { name: MyProduct, type: { library: [automatic] }, targets: [MyTarget] } ], minimumPlatformVersions: [ { name: macOS, version: 10.15 } ] } }版本特定清单Version-specific manifests集合生成器应同时纳入默认清单Package.swift和版本特定清单机制详见 SwiftVersionSpecificPackaging.md对于Package.swift使用其内声明的 tools 版本作为manifests键对于版本特定清单如Packageswift-4.2.swift使用文件名中的版本号即4.2且清单内声明的 tools 版本必须与文件名中的版本一致。需要注意的是包集合不支持版本特定标签Version-specific tags即远程依赖解析中的版本特定标签机制不能用于包集合场景。2.5 完整的示例集合以下 JSON 是 PackageCollections.md 提供的完整示例展示了包含两个包、多版本、多清单的合法集合{ name: Sample Package Collection, overview: This is a sample package collection listing made-up packages., keywords: [sample package collection], formatVersion: 1.0, revision: 3, generatedAt: 2020-10-22T06:03:52Z, packages: [ { url: https://www.example.com/repos/RepoOne.git, summary: Package One, readmeURL: https://www.example.com/repos/RepoOne/README, license: { name: Apache-2.0, url: https://www.example.com/repos/RepoOne/LICENSE }, versions: [ { version: 0.1.0, summary: Fixed a few bugs, manifests: { 5.1: { toolsVersion: 5.1, packageName: PackageOne, targets: [ { name: Foo, moduleName: Foo } ], products: [ { name: Foo, type: { library: [automatic] }, targets: [Foo] } ] } }, defaultToolsVersion: 5.1, verifiedCompatibility: [ { platform: { name: macOS }, swiftVersion: 5.1 }, { platform: { name: iOS }, swiftVersion: 5.1 }, { platform: { name: Linux }, swiftVersion: 5.1 } ], license: { name: Apache-2.0, url: https://www.example.com/repos/RepoOne/LICENSE }, createdAt: 2020-10-21T09:25:36Z } ] }, { url: https://www.example.com/repos/RepoTwo.git, summary: Package Two, readmeURL: https://www.example.com/repos/RepoTwo/README, versions: [ { version: 2.1.0, manifests: { 5.2: { toolsVersion: 5.2, packageName: PackageTwo, targets: [ { name: Bar, moduleName: Bar } ], products: [ { name: Bar, type: { library: [automatic] }, targets: [Bar] } ] } }, defaultToolsVersion: 5.2 }, { version: 1.8.3, manifests: { 5.0: { toolsVersion: 5.0, packageName: PackageTwo, targets: [ { name: Bar, moduleName: Bar } ], products: [ { name: Bar, type: { library: [automatic] }, targets: [Bar] } ] } }, defaultToolsVersion: 5.0 } ] } ] }2.6 发布工具链任何人都可以创建并发布包集合。官方推荐的创建方式是使用独立的swift-package-collection-generator项目提供的四个工具package-collection-generate给定包 URL 列表生成一个包集合package-collection-sign对包集合签名package-collection-validate对包集合执行基本校验package-collection-diff对比两个包集合的内容差异。对于需要自定义实现的场景数据模型通过PackageCollectionsModel模块开放仓库对应目录 Sources/PackageCollectionsModel。2.7 配置文件与安全机制配置文件所有与包集合相关的配置存储在~/.swiftpm/config/collections.json中它记录用户的集合列表以及add命令中--trust-unsigned、--skip-signature-check等标志设置的偏好。该文件由 SwiftPM 命令自动管理用户不应手工编辑。集合签名与安全风险发布者可对集合签名以确立真实性、保护完整性这是可选操作但用户添加未签名集合前会被提示确认。签名证书必须满足 PackageSecurity.md 中列出的证书要求否则包管理器返回错误。签名并不能防御所有攻击向量文档明确指出了两类残余风险签名剥离Signature stripping攻击者移除已签名集合的签名使其作为未签名集合被下载从而绕过签名检查。防御手段是发布者声明集合已签名当unsigned警告出现在本应签名的集合上时用户应中止add操作。签名替换Signature replacement攻击者修改集合后用另一张证书重新签名只要签名有效 SwiftPM 就会接受。防御手段是**证书固定certificate-pinning**配置。证书固定配置允许发布者要求对其集合强制签名检查防御签名剥离并限制可用于签名的证书防御签名替换。其落地方式是在仓库源码 Sources/PackageCollections/PackageCollectionsCertificatePolicy.swift 的defaultSourceCertPolicies字典中增加条目键为集合 URL 的 host 组件private static let defaultSourceCertPolicies: [String: CertificatePolicyConfig] [ // The key should be the host component of the package collection URL. // This would require all package collections hosted on this domain to be signed. www.example.com: CertificatePolicyConfig( // The signing certificate must have this subject user ID certPolicyKey: CertificatePolicyKey.default(subjectUserID: exampleUserID), /* To compute base64-encoded string of a certificate: let certificateURL URL(fileURLWithPath: path to DER-encoded root certificate file) let certificateData try Data(contentsOf: certificateURL) let base64EncoodedCertificate certificateData.base64EncodedString() */ base64EncodedRootCerts: [base64-encoded root certificate] ) ]随后需通过 Pull Request 提交审查请求者须提供 DER 编码的证书文件SwiftPM 团队会验证证书链有效性并添加指向该 PR 的 TXT 记录以证明域名所有权团队会用dig -t txt DOMAIN验证。变更合入后将在下一个 SwiftPM 版本生效。由于证书固定配置与 Web 域名绑定它仅适用于托管在 Webhttps://上的已签名集合不覆盖本地文件系统file://上的集合。签名校验的命令行行为对于已签名集合签名无效时会报错$ 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当发布者要求强制签名但集合实际未签名时$ swift package-collection add https://www.example.com/bad-packages.json The collection is missing required signature, which means it might have been compromised.此时用户不应添加该集合。若根证书缺失导致无法验证签名可先获得发布者根证书DER 编码并保存到~/.swiftpm/config/trust-root-certs显式声明信任该发布者及其发布的集合由于 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显式确认信任。注意--skip-signature-check对未签名集合无效。三、可执行目标测试Executable Target Testing5.5 之前测试目标无法直接测试可执行目标executable target内部的数据结构与算法。5.5 起测试目标可以像链接库一样链接可执行目标可执行目标中除main入口点本身以外的所有代码都对单元测试可见独立的可执行文件仍然会被链接并且可以像以前一样作为子进程进行测试该特性仅对tools 版本为5.5或更新的包中定义的测试生效对应 PR #3316。这意味着开发者可以将命令行工具的核心逻辑解析、算法、数据结构与薄薄的入口层分离直接编写单元测试。仓库的测试夹具中Fixtures/Miscellaneous/TestableExe含测试目标与可执行目标混合结构与 Fixtures/Miscellaneous/TestableExeWithResources、Fixtures/Miscellaneous/TestableExeWithDifferentProductName 等系列目录即为该特性的功能验证样本展示了可执行目标被测试目标依赖时的布局形态。四、Manifest API 改进4.1 两个新的依赖便捷初始化器Package.swift中新增了两个便捷初始化器对应 PR #3292、#3310可以直接用revision提交哈希或branch分支名声明依赖.package(url: String, revision: String) .package(url: String, branch: String)在 SwiftPM 的底层模型中这两种依赖方式被建模为 PackageDependencyDescription.swift 中Requirement枚举的case exact(Version)、case revision(String)、case branch(String)等分支见该文件第 139-142 行附近并在比较/序列化逻辑约第 514-571 行中与 range 型需求区分处理。从源码结构看revision与branch属于非版本范围类需求解析时按具体提交或分支锁定适合依赖尚未打标签的开发分支或精确提交的场景。4.2 基于目标的依赖解析语法改进目标级依赖解析target-based dependency resolution也得到增强现在接受更直观的.product(name:package:)语法其中package参数为包 URL 所定义的包名对应 PR #3280。这一语法改进让读者从调用处即可辨认产品来自哪个包减少了同名产品间的歧义。五、其他改进与修复5.1 单源文件可执行目标的 main 支持5.5 起只要源文件名不是main.swift单源文件可执行目标就可以使用main注解。原因是 Swift 编译器对单文件模块有特殊的语义处理main.swift文件被特殊对待其中的顶层代码可直接作为程序入口。为规避该语义SwiftPM 在编译包含单个 Swift 源文件且文件名不是main.swift的可执行模块时会传递-parse-as-library标志。该特性同样要求包的 tools 版本为5.5或更新对应 PR #3410。这一逻辑在构建描述层有据可查构建系统在生成 Swift 模块编译参数时会检查模块是否为单源文件可执行目标并决定是否附加-parse-as-library见 Sources/Build/BuildDescription/SwiftModuleBuildDescription.swift 中关于main注解检测与args [-parse-as-library]的实现路径。仓库夹具 Fixtures/Miscellaneous/AtMainSupport 即用于验证main在 SwiftPM 构建中的行为。5.2 二进制依赖解压修复修复了一个二进制依赖解析问题此前解析包含二进制依赖的包时二进制归档binary archive解压可能失败该问题在 5.5 中已解决对应 PR #3507。六、使用前提与版本适用性说明以上能力均以Swift 5.5 工具链为前提Package Collections 的 CLI 与签名校验在 Swift 5.5 引入文档元数据标注Available(Swift, introduced: 5.5)可执行目标测试与main支持要求包声明tools 版本 5.5 或更新。若你的包使用更早的 tools 版本这些新能力不会自动生效升级 tools 版本的方式参见 SettingSwiftToolsVersion.md。七、小结SwiftPM 5.5 通过 Package Collections 建立了一套从发现、订阅到发布的完整包发现生态配合签名校验与证书固定机制兼顾了开放性与供应链安全可执行目标测试填补了命令行工具单元测试的空白两个依赖便捷初始化器与.product(name:package:)语法让 Manifest 编写更贴近直觉main支持则让单文件工具项目能享受标准入口注解。对于正在构建 Swift 库或工具链的开发者而言5.5 的这些能力——尤其是包集合的 JSON 格式与swift package-collection命令族——值得在真实项目中直接落地。赞分享开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载相关推荐SwiftPM 5.4 新特性深度解析显式可执行目标、自动测试发现与依赖缓存全指南SwiftPM 5.4 新特性深度解析显式可执行目标、自动测试发现与依赖缓存全指南 SwiftPM 5.4Swift Package Manager带来了开发工具构建工具SwiftPM 5.7 Release Notes插件增强、包注册表与模块别名三大能力解析SwiftPM 5.7 Release Notes插件增强、包注册表与模块别名三大能力解析 SwiftPM 5.7即 Swift 5.7 工具链附带的 Sw开发工具构建工具TDengine 3.4.1.13 Release Notes 深度解析连接器高可用、WAL 自愈与流计算增强TDengine 3.4.1.13 Release Notes 深度解析连接器高可用、WAL 自愈与流计算增强 本文基于 TDengine 开源仓库 3.4.数据库时序数据库物联网大数据实时分析云原生上一篇肺病治疗技术发展的卡尔曼滤波分析方法从经验医学到精准医疗的降噪之旅下一篇Data-Juicer数据质量分类器终极指南如何一键自动筛选高质量大模型训练数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考