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

l -*_*c l 5 xcode swift swift-package-manager

动机:能够生成一个基于 SPM 的静态库 Xcode 项目会很有用,该项目可以从另一个(不是基于 SPM 的)Xcode 项目中引用generate-xcodeproj似乎是一种合理的尝试方法,但是,generate-xcodeprojcreates 是一个动态框架项目,而不是一个静态库项目。

问题:在 之后generate-xcodeproj,需要哪些 Xcode 步骤(对于 Xcode 9 和 Swift 4)将type: .staticSwift 包库静态链接到一个简单的命令行二进制可执行文件中……类似于相应的swift build?

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

目标:使用 Xcode 生成静态链接的可执行文件,就像swift build从命令行生成的内容一样……为同一个模块产品。

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

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

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

TinkerEvalStaticLib很简单并且明确设置为 type .static

TinkerEvalStaticLib.swift

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

包.swift

…
products: [
    .library(name: "TinkerEvalStaticLib", 
    type: .static, // expressly set to be a static library
    …
Run Code Online (Sandbox Code Playgroud)

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

main.swift

import TinkerEvalStaticLib
let _ = TinkerEvalStaticLib.printSomething() 
Run Code Online (Sandbox Code Playgroud)

包.swift

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

观察:

  1. 在该TinkerEvalStaticCli目录中,swift build将创建一个独立的可重定位、静态链接的可执行文件。
prompt> ./TinkerEvalStaticCli_spm 
Library says, 'Hello.'
Run Code Online (Sandbox Code Playgroud)
  1. 但是,创建的 Xcode 项目swift package generate-xcodeproj会创建一个动态链接的可执行文件,该可执行文件需要单独的库。
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
Run Code Online (Sandbox Code Playgroud)

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

小智 0

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

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