动机:能够生成可以referenced from another (not SPM-base) Xcode project的基于SPM的静态库Xcode项目会很有用。 generate-xcodeproj
似乎是一种合理的尝试方法,但是,generate-xcodeproj
创建的是一个动态框架项目而不是静态库项目。
问题:在generate-xcodeproj
之后,将type: .static
Swift包库静态链接到一个简单的命令行二进制文件中需要Xcode步骤(对于Xcode 9和Swift 4)可执行文件...类似于相应的swift build
生成的内容?
换句话说,如何最终得到SPM生成的静态库Xcode项目,该项目可用作非SPM Xcode项目中的子项目。
目标:使用Xcode创建静态链接的可执行文件,例如swift build
从命令行 ...为同一模块产品生成的内容。
问题是generate-xcodeproj
生成的项目会创建一个动态链接的产品(不是预期的),而swift build
会生成一个静态链接的产品(如预期的那样)。
示例:考虑两个Swift Manager软件包(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项目会构建一个静态链接二进制文件(而不是动态链接二进制文件),类似于相应的{生成的静态链接二进制文件{1}}。因此,此问题是针对当前SPM swift build
限制的变通方法。
答案 0 :(得分:0)
Swift包模型不是与Xcode模型的一对一映射,因此存在一些差异。 generate-xcodeproj
命令适用于喜欢在Xcode IDE中工作的开发人员。也就是说,我们确实需要将生成的Xcode项目从框架移动到静态库,以便有更多的相似之处。
我建议使用swift build
创建实际的静态链接二进制文件。