动机: 能够生成一个基于 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) 包:
- 静态库:
TinkerEvalStaticLib
⇗以swift package init --type library
为起点。 - 命令行可执行文件:
TinkerEvalStaticCli
⇗以swift 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") ),
],
…
观察:
- 在
TinkerEvalStaticCli
目录中,swift build
将创建一个独立的可重定位、静态链接的可执行文件。
prompt> ./TinkerEvalStaticCli_spm
Library says, 'Hello.'
- 但是,使用
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/