swift包是否可以在不依赖其他包的情况下为其他包提供支持?

swift包是否可以在不依赖其他包的情况下为其他包提供支持?,swift,swift-package-manager,Swift,Swift Package Manager,我正在制作一个包,如果另一个包包含在使用我的包的模块中,我想为它提供一些扩展。我在想,比如: #if canImport(PromiseKit) import PromiseKit // Perhaps some internal extension on a PromiseKit class, as a helper for below // Some public extension on my class. This code will use PromiseKit. #endif 这个

我正在制作一个包,如果另一个包包含在使用我的包的模块中,我想为它提供一些扩展。我在想,比如:

#if canImport(PromiseKit)
import PromiseKit
// Perhaps some internal extension on a PromiseKit class, as a helper for below
// Some public extension on my class. This code will use PromiseKit.
#endif
这个想法是,如果一个消费模块安装了我的包,并且他们碰巧也有PromiseKit,那么我的包将为PromiseKit提供一些支持。除此之外,我的包裹根本不需要PromiseKit作为附件

最初,我需要在我的Package.swift中将PromiseKit标记为一个依赖项,这样Xcode就可以安装它,这样我就可以在编写扩展时获得自动完成帮助。但如果我不这样做,安装我的软件包将安装PromiseKit,因为它将它标记为一个依赖项,使得
canImport
冗余

因此,在
canImport
中写入代码之后,我是否应该从Package.swift中删除依赖性

但是,过了一段时间,如果PromiseKit的API发生变化,安装我的包的消费模块将无法再编译,对吗

有什么好办法吗?如果一个包没有任何依赖项,但提供了对包a、B、C、D、E、F的一些支持,理想情况下,如果有人安装了我的包,我不希望它也安装所有这些包。有没有办法做到这一点?或者我想做的是不好的练习


更新:

我发现了一些非常奇怪的东西。我的策略很简单:

  • 宣布依赖
  • 为它编写支持代码
  • 消除依赖性
  • 如果可以导入(…)
  • 结果这行不通。我之所以知道这一点,是因为我在一个新项目中安装了我的包,也安装了PromiseKit,但尽管进行了多次清理、重建和Xcode重启,我的支持代码还是无法访问

    这让我相信,如果canImport(…)不是在了解新项目环境的上下文中运行的。它在其他上下文中运行。否则,它会发现PromiseKit已安装,代码将运行,其API将可用

    请注意,如果我在包中声明PromiseKit依赖性,并更新新项目的包,Xcode将自动安装PromiseKit,并且我的支持代码将变得可访问。但是,
    #if canImport(…)
    基本上是多余的,我的包最终带来了所有这些包,这是我不想做的


    这个问题可以简化为:“一个软件包能知道消费项目中是否有一个模块可用吗?”

    我找到了如何让它工作的方法

  • 宣布依赖
  • 为它编写支持代码
  • 如果可以导入(…)
  • 消除依赖性

  • 现在是变化无常的部分。在消费软件包中,我一安装软件包,就可以访问我的支持代码。但一旦我跑干净,游戏就结束了;在运行clean之后,它将不再编译。在这种情况下,我发现我需要删除我的包,清理,构建,再次安装,构建。然后它将成功编译;编译器知道支持代码API。我也可以运行它,支持代码也可以运行。

    我不是专家,但听起来你已经在做的事情应该很棒。如果PromiseKit存在,用户将从您的支持中获益,如果没有造成任何伤害。@matt感谢Neuburg先生:)顺便说一句,我非常喜欢您的书,我对此感到高兴,但请注意,我对软件包知之甚少!但是阅读你的计划,从软件包用户的角度考虑,你的
    #canImport
    想法听起来正是我想要的。