Запустите swift script из проекта Xcode iOS в качестве фазы сборки

Вот простой быстрый script:

#!/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)

Я добавил эту script как фазу сборки (до "фазы источников компиляции" ) в проекте iOS, но XCode не смог построить проект с ошибкой "undefined NSTask()..." Когда я добавил такой же script в проект OSX, проект сборки XCode без каких-либо ошибок.

Вопрос в том, почему XCode ищет NSTask внутри рамки iOS (где не существует) вместо этого запускает swift script в качестве платформы script (например, bash)?

Просто добавьте: swift script не входит в проект с другими файлами для компиляции. Он просто добавлен в фазу сборки, даже до компиляции, других исходных файлов (которые являются objective-c файлами) для ее запуска.

Любые идеи о том, как запустить пользовательский swift script из проекта iOS XCode, когда script содержит классы, которые не входят в структуру iOS?

Ответ 1

При создании для iOS неявного SDK для xcrun является SDK iOS, поэтому вы можете изменить его на SDK Mac OS X с параметром командной строки. Измените первую строку в script на:

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

Ответ 2

+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, вы также можете управлять версией toolchain:

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

также ответы на проверку здесь: fooobar.com/questions/57398/...

Ответ 3

Если вы отключите переменную среды SDKROOT перед вызовом swift script, она затем будет использовать OS X sdk.