【问题标题】:Run swift script from Xcode iOS project as build phase从 Xcode iOS 项目运行 swift 脚本作为构建阶段
【发布时间】:2015-06-22 13:51:48
【问题描述】:

这是一个简单的 swift 脚本:

#!/usr/bin/env xcrun swift

import Foundation

let task = NSTask()
task.launchPath = "/bin/echo"
task.arguments = ["farg1", "arg2"]

let pipe = NSPipe()
task.standardOutput = pipe
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding)

print(output)

我将此脚本添加为 iOS 项目中的构建阶段(在“编译源阶段”之前),但 XCode 未能构建项目并出现错误“未定义的 NSTask()...” 当我在 OSX 项目中添加相同的脚本时,XCode 构建项目没有任何错误。

问题是为什么 XCode 在 iOS 框架内寻找 NSTask(不存在的地方)而不是作为平台脚本(如 bash)运行 swift 脚本?

只是补充一点:swift脚本不包含在项目中以及其他要编译的文件中。它只是添加到构建阶段,甚至在编译之前,其他源文件(它们是 Objective-C 文件)来运行它。

当脚本包含不属于 iOS 框架的类时,如何从 iOS XCode 项目运行自定义 swift 脚本?

【问题讨论】:

  • 您能解释一下如何将此脚本添加到构建阶段吗?

标签: ios xcode swift


【解决方案1】:

在为 iOS 构建时,xcrun 的隐式 SDK 是 iOS SDK,因此您可以使用命令行参数将其更改为 Mac OS X SDK。将脚本中的第一行更改为:

#!/usr/bin/env xcrun --sdk macosx swift

【讨论】:

  • 谢谢,这是一个解决方案。默认情况下 swift 使用 iOS 框架,但我需要它 osx,
  • @Mats 如果我不使用 xcrun 而只是使用 /usr/bin/swift,似乎 swift 默认为 iOS。它甚至使用“env -i”来尝试 iOS。它是怎么知道的?我希望我的脚本只依赖于 swift,而不是 Xcode。
【解决方案2】:

@Mats 的回答 +1。

对于遇到*** is only available on OS X 10.11 or newer 之类错误的任何人。

你可以:

#!/usr/bin/env xcrun --sdk macosx swift -target x86_64-macosx10.11

更新 1:

如果你没有为 Swift 3 做好准备,但你正在使用 Xcode 8,你也可以控制工具链版本:

xcrun --toolchain com.apple.dt.toolchain.Swift_2_3 -f swift

所以:

#!/usr/bin/env xcrun --toolchain com.apple.dt.toolchain.Swift_2_3 --sdk macosx swift -target x86_64-macosx10.11

也可以在这里查看答案:https://stackoverflow.com/a/36254848/1298043

【讨论】:

    【解决方案3】:

    如果您在调用 swift 脚本之前取消设置 SDKROOT 环境变量,它将使用 OS X sdk。

    【讨论】:

    • 如何做到这一点?另外,我想如果我在“编译源”之前运行这个脚本,我需要将它设置回使用 iOS sdk?
    • 用XCode11.4检查,不需要重新设置回iOS SDK。
    猜你喜欢
    • 2013-12-03
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-01-18
    • 1970-01-01
    • 2011-10-26
    • 2016-09-22
    相关资源
    最近更新 更多