如何为本地包添加依赖
我正在开发一个SwiftUI的 iOS应用,配套的watchOS应用使用一个本地的公共包来共享数据、服务和工具。在整个开发过程中,我一直让它尽量自给自足,但一个硬性要求是必须把日志和错误上报到Sentry,因此我别无选择,只能集成Sentry SDK。这个公共包和应用本身的许多地方都会向Sentry实例记录日志。
起初,我按照 说明 使用向导安装Sentry SDK,它按预期被添加到Xcode管理的应用依赖列表中。
开发阶段一切正常。但当我尝试归档项目以提交TestFlight时,公共包中出现了Sentry依赖找不到的错误。

注:这个错误仅在尝试归档项目后才会出现。本地构建和运行都没有问题。
上网搜索这个问题非常无用,因为每个结果都是告诉你如何把依赖项添加到应用中,而不是添加到独立包中的办法。有一个来源 显示了使用SPM脚本来添加依赖项的方式,于是我尝试按照 SPM指南 进行操作,但并未解决错误。
// swift-tools-version: 6.3
import PackageDescription
let package = Package(
name: "CommonUtilities",
products: [
.library(
name: "CommonUtilities",
targets: ["CommonUtilities"]
),
],
dependencies: [
.package(url: "https://github.com/getsentry/sentry-cocoa", from: "9.16.1"),
],
targets: [
.target(
name: "CommonUtilities",
// I've tried with and without this section:
dependencies: [
.product(name: "sentry-cocoa", package: "sentry-cocoa"),
],
),
],
swiftLanguageModes: [.v6]
)
我还尝试了其他方法:
- 在归档前清理构建文件夹也无效。
- 将
["Sentry": "sentry-cocoa"]添加到target >> dependencies >> product >> moduleAliases,反之亦然,似乎没有效果。(也不清楚那到底做了什么。) - 对 这个问题 的回答没有帮助,因为那个复选框从一开始就在我的项目中被勾选。
我不想做的事情:
- 将Sentry日志记录包裹在某个
LoggingProtocol对象中,在应用代码中初始化后再手动传递给公共包中的每个模块。 - 完全移除utilities包,并在应用之间复制所有代码。
- 迁移到CocoaPods。(很快就会被逐步淘汰 ,所以这不是一个长期解决方案。)
TL;DR - 本地构建和运行我的应用没有问题,但在尝试进行 Product >> Archive 时,以上错误会出现。
解决方案
Sentry的仓库URL slug (sentry-cocoa) 与通过SPM暴露的产品名称(Sentry)不同。你的 dependencies 块引用了错误的名称:
// Wrong "sentry-cocoa" is the repo/package name, not the product name
.product(name: "sentry-cocoa", package: "sentry-cocoa"),
// Correct
.product(name: "Sentry", package: "sentry-cocoa"),
完整的 Package.swift 应该看起来像:
// swift-tools-version: 6.3
import PackageDescription
let package = Package(
name: "CommonUtilities",
products: [
.library(name: "CommonUtilities", targets: ["CommonUtilities"]),
],
dependencies: [
.package(url: "https://github.com/getsentry/sentry-cocoa", from: "9.16.1"),
],
targets: [
.target(
name: "CommonUtilities",
dependencies: [
.product(name: "Sentry", package: "sentry-cocoa"),
]
),
],
swiftLanguageModes: [.v6]
)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。