Swift 包:在库之间共享内部代码,但不在库用户之间共享
Swift packages: sharing internal code between libraries but not library users
我应该如何在 Package.swift
中定义的模块(Swift 包术语中的目标)之间共享代码,同时仍然将共享代码中的 API 暴露给库用户?表达这个问题的另一种方式是:How to share internal
API in module with specific other modules (other libraries) but not library users.
例如,假设我有 2 个库,Human 和 Dog,用户只需要其中的一个(或者同时使用两个,如果他们要)。我想出了两种方法:
- 我可以创建另一个库,Core,其中包含 public API 应该共享给库用户( Human 和 Dog),并使用单独的内部库 Internal。
- 这可以防止在每个文件中单独设置实体(方法、枚举、类 等)的访问控制,以避免在 Core 中过度暴露可能不是能够进入 Internal。这是因为我总是需要将实体设置为 public 以便在 Human 或 Dog 中访问,这意味着它们对图书馆用户也是 public。
- 想要使用库 Human 的库用户还必须知道导入 Human 和 Core 到他们的 Xcode 项目/源文件。
- 使用
target(sources:)
记录的 here,将共享代码目录显式添加到两个目标而不是 1 个。如果 1 个源文件在 2 个目标之间共享,这实际上会引发错误:target 'Library Human' has sources overlapping sources
.
我认为第二个选项更好,但它不起作用。也许有更好的选择我不知道?
之所以需要将它们放在单独的模块中,是因为其中一个 (Human) 依赖于相当大的依赖项,而 Dog[ 不需要=47=].
我最初在 Swift 论坛 here 上发布了这个,如果找到解决方案,我会在这里更新。
我通过执行问题中列出的第一种方法解决了这个问题(4 个模块):
- 核心:库A和B共享的代码,用户应该可以导入。
- 内部: 库用户应该不能 导入的代码。取决于核心。还取决于不应向库用户公开的其他库。
- 库 A(例如人类):用户可以选择使用的一个库。
- 库 B(例如 Dog):用户可以选择使用的另一个库。
然后在图书馆 A 和图书馆 B 中,我有一个名为 Exports.swift
的文件,其中包含 @_exported import Core
.
我应该如何在 Package.swift
中定义的模块(Swift 包术语中的目标)之间共享代码,同时仍然将共享代码中的 API 暴露给库用户?表达这个问题的另一种方式是:How to share internal
API in module with specific other modules (other libraries) but not library users.
例如,假设我有 2 个库,Human 和 Dog,用户只需要其中的一个(或者同时使用两个,如果他们要)。我想出了两种方法:
- 我可以创建另一个库,Core,其中包含 public API 应该共享给库用户( Human 和 Dog),并使用单独的内部库 Internal。
- 这可以防止在每个文件中单独设置实体(方法、枚举、类 等)的访问控制,以避免在 Core 中过度暴露可能不是能够进入 Internal。这是因为我总是需要将实体设置为 public 以便在 Human 或 Dog 中访问,这意味着它们对图书馆用户也是 public。
- 想要使用库 Human 的库用户还必须知道导入 Human 和 Core 到他们的 Xcode 项目/源文件。
- 使用
target(sources:)
记录的 here,将共享代码目录显式添加到两个目标而不是 1 个。如果 1 个源文件在 2 个目标之间共享,这实际上会引发错误:target 'Library Human' has sources overlapping sources
.
我认为第二个选项更好,但它不起作用。也许有更好的选择我不知道?
之所以需要将它们放在单独的模块中,是因为其中一个 (Human) 依赖于相当大的依赖项,而 Dog[ 不需要=47=].
我最初在 Swift 论坛 here 上发布了这个,如果找到解决方案,我会在这里更新。
我通过执行问题中列出的第一种方法解决了这个问题(4 个模块):
- 核心:库A和B共享的代码,用户应该可以导入。
- 内部: 库用户应该不能 导入的代码。取决于核心。还取决于不应向库用户公开的其他库。
- 库 A(例如人类):用户可以选择使用的一个库。
- 库 B(例如 Dog):用户可以选择使用的另一个库。
然后在图书馆 A 和图书馆 B 中,我有一个名为 Exports.swift
的文件,其中包含 @_exported import Core
.