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

时间:2018-01-21 05:33:59

标签: swift xcode swift-package-manager

动机:能够生成可以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)包:

  1. 静态库:TinkerEvalStaticLibswift package init --type library为起点。
  2. 命令行可执行文件:TinkerEvalStaticCliswift package init --type executable为起点。
  3. 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将创建一个独立的可重定位,静态链接的可执行文件。
    2. prompt> ./TinkerEvalStaticCli_spm 
      Library says, 'Hello.'
      
      1. 但是,使用swift package generate-xcodeproj创建的Xcode项目会创建一个动态链接的可执行文件,需要单独的库。
      2. 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限制的变通方法。

1 个答案:

答案 0 :(得分:0)

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

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