swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?

标签 swift xcode swift-package-manager

动机: 能够生成一个基于 SPM 的静态库 Xcode 项目会很有用 referenced from another (not SPM-base) Xcode project . generate-xcodeproj 似乎是一种合理的尝试方法,但是,generate-xcodeproj 创建的是一个动态框架项目而不是静态库项目。

问题:在generate-xcodeproj之后,需要哪些Xcode步骤(对于Xcode 9和Swift 4)来静态链接一个type: .static Swift Package Library 变成一个简单的命令行二进制可执行文件……类似于相应的 swift build 生成的内容?

换句话说,如何最终得到一个 SPM 生成的静态库 Xcode 项目,该项目可以用作非 SPM Xcode 项目中的子项目。

目标使用 Xcode 生成一个静态链接的可执行文件,就像 swift build 从命令行 生成的一样......对于相同的模块产品。

问题是 generate-xcodeproj 生成的项目创建了一个动态链接的产品(不是预期的),而 swift build 生成了一个静态链接的产品(如预期的那样)。

示例:考虑两个 Swift Manager Packages (SPM) 包:

  1. 静态库:TinkerEvalStaticLibswift package init --type library 为起点。
  2. 命令行可执行文件:TinkerEvalStaticCliswift package init --type executable 作为起点。

TinkerEvalStaticLib 很简单,明确设置为 .static 类型。

TinkerEvalStaticLib.swift

public class TinkerEvalStaticLib {
    public static func printSomething() -> String {
        let s = "Library says, 'Hello.'"
        print(s)
        return s
    }
} 

Package.swift

…
products: [
    .library(name: "TinkerEvalStaticLib", 
    type: .static, // expressly set to be a static library
    …

TinkerEvalStaticCli 也很简单,并且有 TinkerEvalStaticLib 作为依赖项。

main.swift

import TinkerEvalStaticLib
let _ = TinkerEvalStaticLib.printSomething() 

Package.swift

…
name: "TinkerEvalStaticCli",
dependencies: [
  .package(
    url: "git@github.com:VaporExamplesLab/TinkerEvalStaticLib.git",
    .branch("master") ),
],
…

观察:

  1. TinkerEvalStaticCli 目录中,swift build 将创建一个独立的可重定位、静态链接的可执行文件。
prompt> ./TinkerEvalStaticCli_spm 
Library says, 'Hello.'
  1. 但是,使用 swift package generate-xcodeproj 创建的 Xcode 项目会创建一个需要单独库的动态链接可执行文件。
prompt> ./TinkerEvalStaticCli_xc 
dyld: Library not loaded: @rpath/TinkerEvalStaticLib.framework/Versions/A/TinkerEvalStaticLib
  Referenced from: /Users/…/./TinkerEvalStaticCli_xc
  Reason: image not found
Abort trap: 6

注意:人们会期望 swift package generate-xcodeproj 生成的 Xcode 项目会构建一个类似于静态链接的二进制文件(而不是动态链接的二进制文件)由相应的 swift build 生成的链接二进制文件。因此,这个问题是针对当前 SPM generate-xcodeproj 限制的解决方法。

最佳答案

Swift 包模型不是与 Xcode 模型的一对一映射,因此存在一些差异。 generate-xcodeproj 命令适用于喜欢在 Xcode IDE 中工作的开发人员。也就是说,我们确实需要将生成的 Xcode 项目从框架移动到静态库,以便有更多相似之处。

我建议使用 swift build 来创建实际的静态链接二进制文件。

关于swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363996/

相关文章:

objective-c - xcode 4垃圾收集已删除?

swift-package-manager - 使用 Swift 包管理器添加额外的库

swift - UINavigationController 导航栏不应用透明图像

ios - CloudKit 记录类型继承

ios - UIImagePickerController 编辑图像 - 在 Swift 2 中将 NSRect 转换为 CGRect

ios - 代理背后的 XCode Swift 包管理器错误

ios - 缺少包产品 <包依赖项名称>

swift - 缺少 RealmSwift.framework

ios - 如何在不使用第三方 url 的情况下获取 iPhone 的公共(public) IP 地址

iphone - iPhone 应用程序的财务图表