从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift
Posted
技术标签:
【中文标题】从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift【英文标题】:Exporting Package.swift for Swift Package Manager from existing Xcode project 【发布时间】:2020-10-02 17:49:43 【问题描述】:我在 macOS Catalina 10.15.6 上使用 Xcode 11.3。
我有一个为 ios 构建应用程序的现有 Xcode 项目。我有兴趣在与swift
命令行解释器的交互会话中重用一些类。我要使用的类是从 Xcode 数据模型自动生成的 Core Data 类,以及我编写的与 Core Data 类一起使用的一些类。该应用程序具有 UI 屏幕并使用 UIKit,但我没有尝试使用这些类中的任何一个;我希望我可以编译这些类然后不引用它们,或者以某种方式告诉 Swift 包管理器完全忽略这些类。
我想我想做的是为现有的 Xcode 项目导出一个 Package.swift,这样命令行中的 swift build
就能够编译所有项目类,或者,如果失败了,在至少非 UI 类,然后swift run --repl
将能够通过import
加载这些类。
我在 Xcode 中看到一个菜单项,用于创建新的 Swift 包,而不是导出现有项目。有没有办法导出现有项目?
【问题讨论】:
【参考方案1】:没有菜单命令或实用程序可以将应用程序转换为静态库、动态框架或 swift 包,因为它们是具有不同设置等的不同类型的项目。
如果您想将项目的一部分导出为 swift 包,您应该手动执行后续步骤:
1.在项目的根目录中创建 Package.swift 文件
import PackageDescription
let package = Package(
name: “MyLib”,
products: [
.library(name: "MyLib", targets: ["MyLib"])
],
targets: [
.target(name: "MyLib"),
],
...
)
2。在项目的根目录下创建带有子文件夹./Sources/MyLib
的文件夹。
默认情况下,swift 包结构需要将所有源文件放在 Sources/LibraryName
文件夹下,但您可以在下面进行更改。
注意:您可以使用 swift package init
简化前两个步骤,它会创建 Package.swift、Sources 和 Test 文件夹等。
3.包含源文件
a) 将需要共享的文件从当前位置移动到 MyLib 文件夹。
例如:
./Classes/MyEntity.swift -> ./Sources/MyLib/MyEntity.swift
您还必须更新 Xcode 项目中移动文件的位置以使其可编译。
b) 使用path
、sources
和exclude
将所需的源文件从当前位置指向您的包:
.target(name: "MyLib", path: "Classes"),
注意:不要忘记在导入包后将您的类公开以访问它们:
public class MyEntity
...
毕竟,您将有两个工作项目 - 旧 XCode 的一个和新的 Swift 包。
4.回复
现在你可以在你的 swift 包中使用命令行解释器了:
swift run --repl
import MyLib
let entity = MyEntity()
...
【讨论】:
感谢您的回答!我有几个问题。 (1)现有项目通过Cocoapods管理外部依赖。有没有办法以可以导入 Package.swift 的形式从 Podfile 中提取依赖项列表?我想我可以手动完成,但我想知道是否可以自动化它。 (2) Core Data 有什么特别的考虑吗?现有项目使用 $HOME/Library/Developer/Xcode/DerivedData 下某处的 Core Data 实体自动生成的类。我想知道如何将这些带入项目中。再次感谢! 1) 关于 cocoapods 看到这个答案***.com/questions/63700091/… 2) CoreData:您可以为您的实体禁用 Codegen=Manual/None 并在项目中拥有自己的托管类,这些类可以移动到 swift 包的文件夹中,或者只是将自动生成的文件复制到 swift 包中。对于 Xcode 11/Swift 5.2,您不能将模型文件包含到 swift 包中,但您可以通过编程方式创建模型 (medium.com/@dmytro.anokhin/…)。对于 Xcode 12/Swift 5.3 可以添加 Core Data 模型资源 (useyourloaf.com/blog/add-resources-to-swift-packages) 非常感谢您提供这些额外信息。看来我还有很多事情要做。最后一个问题,是否可以将源代码放在 Sources/packagename 以外的地方?理想情况下,我会保持与现有 Xcode 项目相同的目录结构,但如果需要,我会更改它。 是的,有可能,您可以在目标下使用sources
、path
和exclude
,请参阅我的更新 3 (developer.apple.com/documentation/swift_packages/target/…)以上是关于从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift的主要内容,如果未能解决你的问题,请参考以下文章
不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件