我正在开发一个支持不同主题的设计系统。主题在运行时无法更改,因此希望利用这一点并进行条件导入。
设计系统类型是一种通用类型,类似于 DS<Colors, Fonts>。这存在于设计系统包上的基本设计系统目标中。然后在同一个包中,我有一个单独的目标,它依赖于每个主题的基本设计系统目标,它只提供泛型类型的专业化,提供自己的颜色和字体。
然后我需要有一系列的包作为 SDK(将在主应用程序中使用),可以很容易地配置为在编译时使用一个主题或另一个主题构建。
理想情况下,我设想它的工作方式是主应用程序导入它想要使用的一个主题,并且包能够针对该主题定义的设计系统专用类型进行编译。所以我开始尝试一些方法在这些包中的第一个上实现这一点,但到目前为止没有成功。
在MyTarget
我想使用任何可用设计系统的源代码中,我这样做:
#if canImport(ThemeADesignSystem)
import ThemeADesignSystem
public typealias DS = ThemeADesignSystem.DS
#elseif canImport(ThemeBDesignSystem)
import ThemeBDesignSystem
public typealias DS = ThemeBDesignSystem.DS
#else
import DesignSystem
public typealias DS = DesignSystem.DS
#endif
该包的目标定义为
.target(
name: "MyTarget",
dependencies: [
.product(name: "DesignSystem", package: "iOSDesignSystem")
]
),
.target(
name: "MyTargetWithThemeA",
dependencies: [
.product(name: "ThemeADesignSystem", package: "iOSDesignSystem"),
.target(name: "MyTarget")
]
),
.target(
name: "MyTargetWithThemeB",
dependencies: [
.product(name: "ThemeBDesignSystem", package: "iOSDesignSystem"),
.target(name: "MyTarget")
]
)
我的包的产品是基于 MyTargetWithThemeA 和 MyTargetWithThemeB 构建的静态库,因此客户可以导入与其主题匹配的相应库。
我期望拥有一个依赖于MyTarget
并且还依赖于适当主题产品的目标,会使canImport
指令在编译时产生 true,并且MyTarget
该模块使用相应的设计系统类型构建。但似乎情况并非如此。
关于它为什么不能这样工作以及我能做些什么来实现我的目标的任何想法?