正在从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift

Exporting Package.swift for Swift Package Manager from existing Xcode project

我在 macOS Catalina 10.15.6 上使用 Xcode 11.3。

我有一个现有的 Xcode 项目,它为 iOS 构建了一个应用程序。我有兴趣在与 swift 命令行解释器的交互式会话中重用一些 类。我想使用的 类 是核心数据 类 ,它是从 Xcode 数据模型自动生成的,还有一些 类 我写的可以使用核心数据 类。该应用程序有 UI 个屏幕并使用了 UI 套件,但我没有尝试使用其中任何一个 类;我希望我可以编译那些 类 然后不引用它们,或者以某种方式告诉 Swift 包管理器完全忽略那些 类。

我想我想做的是为现有的Xcode项目导出一个Package.swift,这样在命令行的swift build就可以编译所有的项目 类,或者,如果失败,至少非 UI 类,然后 swift run --repl 将能够通过 [= 加载 类 16=].

我在 Xcode 中看到一个菜单项,用于创建新的 Swift 包,但不能导出现有项目。有没有办法导出现有项目?

没有用于将应用程序转换为静态库、动态框架或 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) 使用 pathsourcesexclude 将所需的源文件从当前位置指向您的包:

.target(name: "MyLib", path: "Classes"),

注意:不要忘记让您的 类 public 在导入包后访问它们:

public class MyEntity {
...
}

毕竟你将有两个工作项目 - 旧 XCode 的一个和新的 Swift 包。

4. REPL

现在您可以在 swift 软件包中使用命令行解释器:

swift run --repl
import MyLib
let entity = MyEntity()
...