从Xcode iOS项目运行swift脚本作为构建阶段

时间:2015-06-22 13:51:48

标签: ios xcode 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无法构建带有错误的项目' undefined NSTask()...' 当我在OSX项目中添加相同的脚本时,XCode构建项目没有任何错误。

问题是为什么XCode在iOS框架中寻找NSTask(在那里不存在)而不是以平台脚本(如bash)的形式运行swift脚本?

添加:swift脚本不包含在项目中,其他文件需要编译。它甚至在编译之前就已经添加到其他源文件(即objective-c文件)的构建阶段来运行它。

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

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:5)

+1 @Mats 的答案。

对于收到*** 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

答案 2 :(得分:1)

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