ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SwiftPM 开发工具链定制指南:用 mk-toolchain 脚本构建可调试的 Manifest/Plugin API 测试环境

SwiftPM 开发工具链定制指南:用 mk-toolchain 脚本构建可调试的 Manifest/Plugin API 测试环境 开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载导读本指南基于 Utilities/mk-toolchain/README.md 展开讲解 Swift Package ManagerSwiftPM开发者如何在 macOS 上通过mk-toolchain脚本把开发工作区Xcode Workspace中构建出的PackageDescription、PackagePlugin、swift-package、swift-build、swift-test、swiftpm-testing-helper、sourcekit-lsp等产物拼装成一个自定义.xctoolchain工具链。读者完成本文后可独立搭建改 Manifest/Plugin API → 一键重建工具链 → 在 VSCode Swift 中即时验证的开发闭环并用 Swift 测试与补全体验来验收 Manifest 与 Plugin API 的人机工效ergonomics改动。背景为什么要自制工具链修改包清单Package.swift所依赖的PackageDescriptionAPI或插件PackagePluginAPI时最自然的验证方式是在一个真实的 Swift 包工程里边改边用观察 API 手感是否顺畅、补全提示是否准确。但 Xcode 的XcodeDefault.xctoolchain中打包的是发布版 Manifest/Plugin 运行库直接修改后无法立即生效。原文档给出的最佳实践是把开发工作区构建出的产物通过软链接替换到一份工具链副本中形成自定义工具链再用TOOLCHAINS环境变量让 VSCode Swift 语言服务器与swift命令选中它。这样你在源码上做的每次改动都能在一个真实包工程中立刻被补全、编译和测试验证而不是停留在单元测试的抽象断言里。前置准备组织开发工作区原文档推荐将 SwiftPM 开发常用的三个仓库克隆到同一目录git clone https://github.com/swiftlang/swift-build git clone https://github.com/swiftlang/swift-package-manager git clone https://github.com/swiftlang/sourcekit-lspswift-package-managerSwiftPM 本体产出swift-package、swift-build、swift-test、swiftpm-testing-helper以及PackageDescription/PackagePlugin两个 API 框架见 Sources/CMakeLists.txt 中的相关目标swift-build新一代构建系统 Swift Build仓库内以container:../../swift-build的方式被引用见 Utilities/SwiftPMSwiftBuild.xcworkspace/contents.xcworkspacedata产出swift-build可执行文件与llbuild框架sourcekit-lsp为编辑器提供索引、补全与诊断的语言服务器负责把新 API 的补全带给 VSCode。说明原文档针对 macOS Xcode 的流程并明确欢迎其他宿主平台如 Linux/Windows的开发者贡献等价工具。本文严格限定在 macOS 环境下描述。创建 xcworkspace在同一目录下创建myNewFeature.xcworkspace并在其中新建contents.xcworkspacedata内容如下?xml version1.0 encodingUTF-8? Workspace version 1.0 FileRef location group:swift-build /FileRef FileRef location group:swift-package-manager /FileRef FileRef location group:sourcekit-lsp /FileRef /Workspace仓库中 Utilities/SwiftPMSwiftBuild.xcworkspace/contents.xcworkspacedata 提供了一个真实范例它以container:../../swift-build与container:../../swiftpm的相对形式引用仓库可用于对照。这里group:前缀表示引用的是工作区内的子目录而非绝对磁盘路径。配置 Xcode Scheme 与构建产物用 Xcode 打开该 xcworkspace新建一个 Scheme并在其 Build 阶段加入以下 TargetPackageDescription PackagePlugin swift-package swift-build swift-test swiftpm-testing-helper sourcekit-lsp各 Target 的职责与源码对应关系如下Target产物仓库源码入口PackageDescriptionManifest API 框架/模块Package.swift依赖它Sources/Runtimes/PackageDescriptionPackagePluginPlugin API 框架/模块插件目标依赖它Sources/Runtimes/PackagePluginswift-packageswift package命令Sources/swift-package/Entrypoint.swiftswift-build新一代构建系统命令swift buildSources/swift-build/Entrypoint.swiftswift-testswift test命令Sources/swift-test/Entrypoint.swiftswiftpm-testing-helper测试运行辅助程序Sources/swiftpm-testing-helper/Entrypoint.swiftsourcekit-lsp语言服务器来自 swift-build 仓库相邻克隆sourcekit-lsp 仓库构建完成后产物会落入 Xcode 的 DerivedData 目录。mk-toolchain脚本通过通配符定位它们见下文脚本解析。运行 mk-toolchain 脚本生成自定义工具链构建 Scheme 成功之后在同时包含三个 git 仓库与 xcworkspace 文件的目录中运行本仓库的脚本./Utilities/mk-toolchain/mk-toolchain脚本Utilities/mk-toolchain/mk-toolchainzsh 实现按以下顺序工作推导名称name$(basename *.xcworkspace .xcworkspace)即取当前目录中唯一的.xcworkspace名如myNewFeature定位源工具链src$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain即当前xcode-select指向的 Xcode 内置工具链定位构建产物从~/Library/Developer/Xcode/DerivedData/${name}-*/Build/Intermediates.noindex/InstallIntermediates/macosx/Products/Debug目录读取产物拷贝底子ditto $src $dest把整份XcodeDefault.xctoolchain复制到~/Library/Developer/Toolchains/${name}.xctoolchain目标路径不存在时由脚本创建覆盖已存在的同名工具链补充 llbuild把 Swift Build 构建出的llbuild.framework拷入工具链的usr/lib/swift/pm/llbuild/供 swift-build 运行时链接软链接二进制把swift-package、swift-build、swift-test、sourcekit-lsp链接到工具链的usr/bin/替换 Manifest/Plugin API清空usr/lib/swift/pm/ManifestAPI/与usr/lib/swift/pm/PluginAPI/再分别将 DerivedData 中的PackageDescription.swiftmodule、PackageDescription.framework、PackagePlugin.swiftmodule、PackagePlugin.framework以及CompilerPluginSupport.swiftmodule软链接进去写入 Info.plist删除原有ToolchainInfo.plist生成带有别名swift、CFBundleIdentifier等于工作区名、以及OverrideBuildSettingsOTHER_SWIFT_FLAGS中追加-plugin-path $(TOOLCHAIN_DIR)/usr/lib/swift/host/plugins、SWIFT_DEVELOPMENT_TOOLCHAINYES、SWIFT_USE_DEVELOPMENT_TOOLCHAIN_RUNTIMEYES的Info.plist冒烟自检依次执行TOOLCHAINS$name swift --version与TOOLCHAINS$name swift build --version确认新工具链可被swift命令识别。脚本的关键校验点脚本内含三道检查便于排错derivedData为空时提示请从包含 xcworkspace 的目录运行源工具链不存在! -d $src时报Source toolchain not foundDerivedData 目录不存在! -d $derivedData时报Derived data not found此时需检查 Scheme 是否真的执行了 Install 构建InstallIntermediates 路径或 DerivedData 路径通配是否与实际 Xcode 布局一致。与源码的对应关系Manifest/Plugin API 在工具链中的位置并非随意选择。ToolchainConfiguration.swiftSources/PackageModel/ToolchainConfiguration.swift中的LibraryLocations在初始化时会基于swiftc路径推导lib/swift/pm/ManifestAPI与lib/swift/pm/PluginAPI而 Sources/PackageModel/UserToolchain.swift 在查找这些框架时依次尝试工具链内lib/swift/pm下的 ManifestAPI/PluginAPI 框架PackageFrameworks目录应用根目录最终回退到基于swiftCompilerPath推导。因此mk-toolchain把框架放进usr/lib/swift/pm/正是 SwiftPM 运行时能够发现它们的标准路径。重要提醒Xcode 升级后需重建原文档特别强调每次 Xcode 升级后都要重新运行mk-toolchain。因为脚本是从当前xcode-select选中的 Xcode拷贝XcodeDefault.xctoolchain的工具链副本中携带的 SDK 文件与运行时swiftc、标准库、swift-plugin-server等后者在 Darwin 上由 Sources/PackageModel/UserToolchain.swift 通过xcrun --find swift-plugin-server定位必须与宿主机 Xcode 版本一致否则会出现版本错配导致的链接或运行失败。用新工具链验证 Manifest/Plugin API 改动1. 初始化插件包在任意新目录中创建 build tool 插件类型包swift package init --type build-tool-plugin--type build-tool-plugin是swift package init支持的包类型之一与empty、library、executable、tool、command-plugin、macro并列定义于 Sources/Workspace/InitPackage.swift 的PackageType枚举中。2. 用 TOOLCHAINS 环境变量在 VSCode 中激活TOOLCHAINSmyNewFeature code .TOOLCHAINS的值即你为 xcworkspace 起的名字对应工具链Info.plist中的CFBundleIdentifier与目录名~/Library/Developer/Toolchains/myNewFeature.xctoolchain。Swift 工具链查找机制会依据该变量在~/Library/Developer/Toolchains下按名称定位工具链swift命令与语言服务器都会被指向新工具链。3. 逐项验收清单原文档给出了一个完整的功能验收顺序逐条执行即可确认工具链可用包解析确认 VSCode 能成功解析该包无红色诊断构建执行包构建并确保成功测试添加测试用例确认测试被发现并能运行swift test经由swift-test入口其测试运行辅助程序即swiftpm-testing-helper实现在 Sources/swiftpm-testing-helper/Entrypoint.swift它负责以--test-bundle-path动态加载测试包并调用其中的mainManifest 补全编辑Package.swift新增一个 target观察补全是否提示出各 target 函数——这正是验证PackageDescriptionAPI 改动的核心场景插件补全编辑插件 Swift 文件在createBuildCommands函数中对context与target参数做补全确认PackagePluginAPI 的新增符号能被 sourcekit-lsp 索引到。全部通过即说明你已拥有一个改动源码 → 重新构建 Scheme → 重跑 mk-toolchain → 在示例包中即时验证的完整测试环境。常见问题排查Derived data not found检查 Scheme 是否包含 Install 阶段或 Xcode 的 DerivedData 目录名与${name}-*通配不匹配可把~路径换成实际的DerivedData/workspace名-hash验证补全不生效确认 VSCode 启动时确实携带了TOOLCHAINS环境变量在已打开窗口内用TOOLCHAINSmyNewFeature swift --version复核版本必要时重启语言服务器让它重新扫描工具链Xcode 升级后链接失败重新运行mk-toolchain重建工具链副本保证 SDK 与运行库版本一致Linux/Windows 支持当前脚本是 macOS Xcode 专用zsh、ditto、xcode-select均依赖 macOS其他平台需要等价工具仓库欢迎此类贡献。小结mk-toolchain把修改PackageDescription/PackagePluginAPI与在真实包工程中体验这些 API直接连通Xcode Scheme 产出二进制与框架脚本将它们在XcodeDefault.xctoolchain副本中以软链接形式替换最终通过TOOLCHAINS环境变量交付给swift与 VSCode。配合 Utilities/mk-toolchain/README.md 中约定的五项验收解析、构建、测试、Manifest 补全、插件补全开发者可以在迭代 API 时第一时间获得真实的使用反馈这正是 SwiftPM 团队验证 Manifest 与 Plugin API 人机工效的标准方式。赞分享开发工具构建工具【免费下载链接】swift-package-managerThe Package Manager for the Swift Programming Language项目地址https://gitcode.com/gh_mirrors/sw/swift-package-manager点击查看免费下载相关推荐理解usearch的实时索引更新增量构建与合并策略理解usearch的实时索引更新增量构建与合并策略 usearch是一个高性能的开源搜索与聚类引擎支持向量和字符串搜索适用于C、Python、Java向量数据库搜索引擎NsEmuTools开发者工具链配置调试与测试环境搭建NsEmuTools开发者工具链配置调试与测试环境搭建 作为一款功能强大的NS模拟器管理工具NsEmuTools为开发者提供了完整的工具链支持。本文将详细介桌面应用开发工具tiny11builder开发环境搭建PowerShell脚本调试与测试流程tiny11builder开发环境搭建PowerShell脚本调试与测试流程 项目概述 tiny11builder是一个用于构建精简版Windows 11镜像操作系统上一篇2024最值得关注的10款笔记软件Awesome Note-Taking权威评测下一篇MRPT构建智能移动机器人的全能开发框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表