Swift 包管理器,基于目标的依赖

Swift Package Manager, target based dependency

我正在尝试获取基于 SPM 的依赖目标,我在此处定义了 Package.swift

所以我在包依赖项中定义了 RxSwift,但它 NOT 在目标 ReCaptcha 中使用,但仅在目标 ReCaptchaRx[=29 中使用=]

我预期会发生什么:

如果我选择 select 只有一个没有 Rx 的目标,我希望它只获取 ReCaptcha 依赖项并忽略 Rx.

实际发生了什么:

仅导入后 ReCaptcha 我正在解决包问题 但无法使用 ,如果我选择导入 window ReCaptchaRx 我是获得预期的可用 Rx 就好了。但是为什么在这种情况下 SPM 甚至获取和解析 RxSwift

问题

为什么 Xcode 在不依赖于它的目标上解析 RxSwift?这可以预防吗?我希望与此示例中的 AppSwizzle 类似的行为是,如果未使用目标则不会被解析。

源代码:

这是一个可用的开源库: https://github.com/JakubMazur/ReCaptcha/blob/swift-package-manager/Package.swift

如果您想在 SPM 中签出此文件,将在分支 swift-package-manager

上解析来自 https://github.com/JakubMazur/ReCaptcha 的包

基本上,Swift 包管理器还不够复杂,无法解决所有传递依赖项,即使它们仅由您不依赖的目标使用。

尽管 Xcode 侧边栏包依赖项列表中显示的所有传递依赖项很混乱,但我认为这并不意味着您的演示应用程序实际上会附带任何未使用的 targets/dependencies。只是在它们显示在侧边栏中并在缓存目录中检出的意义上,它们才显得混乱。

略有不同:as of SPM 5.2, SPM is smart enough to not download transitive dependencies only used by your dependencies' test targets。也许有一天这会得到改进,以涵盖您询问的情况。