【问题标题】:Exporting Package.swift for Swift Package Manager from existing Xcode project从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift
【发布时间】: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 包,而不是导出现有项目。有没有办法导出现有项目?

【问题讨论】:

    标签: swift xcode macos core-data swift-package-manager


    【解决方案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) 使用pathsourcesexclude 将所需的源文件从当前位置指向您的包:

    .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 看到这个答案stackoverflow.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 项目相同的目录结构,但如果需要,我会更改它。
    • 是的,有可能,您可以在目标下使用sourcespathexclude,请参阅我的更新 3 (developer.apple.com/documentation/swift_packages/target/…)
    猜你喜欢
    • 2017-06-13
    • 2018-05-02
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多