2015-06-22 11 views
13

Ecco un semplice script veloce:Esegui rapida script dal progetto Xcode iOS come fase di costruzione

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

ho aggiunto questo script come fase di costruzione (prima di 'compilazione fase fonti) nel progetto di iOS, ma XCode non è riuscito a costruire progetti con errore 'non definito NSTask() ...' Quando ho aggiunto lo stesso script nel progetto OSX, XCode crea il progetto senza errori.

Domanda è perché XCode sta cercando NSTask all'interno del framework iOS (dove non esiste) invece di eseguire uno script rapido come script di piattaforma (come bash)?

Solo per aggiungere: lo script rapido non è incluso nel progetto con altri file da compilare. Viene semplicemente aggiunto in fase di costruzione, anche prima della compilazione, di altri file sorgente (che sono file obiettivo-c) per eseguirlo.

Qualche idea su come eseguire uno script swift personalizzato dal progetto iOS XCode quando lo script contiene classi che non fanno parte del framework iOS?

+0

puoi spiegare come aggiungere questo script per creare la fase? – john07

risposta

14

Quando si costruisce per iOS, l'SDK implicito per xcrun è l'SDK di iOS, quindi è necessario modificarlo in Mac OS X SDK con un parametro della riga di comando. Modificare la prima riga nello script per:

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

Grazie, questa è una soluzione. Per impostazione predefinita, swift utilizza il framework iOS ma ne ho bisogno, osx, – xezo

+0

@Mats Sembra come se avessi i valori predefiniti di default su iOS anche se non sto usando xcrun ma solo/usr/bin/swift. Prova anche iOS con "env -i". Come lo sa? Mi piacerebbe che il mio script si basasse solo su swift, non su Xcode. –

4

+1 per risposta l' @Mats.

Per chi riceve un errore come *** is only available on OS X 10.11 or newer.

È possibile:

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

UPDATE 1:

Se non si è pronti per Swift 3, ma si sta utilizzando Xcode 8, è anche possibile controllare la versione toolchain:

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

Quindi:

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

anche risposte checkout qui: https://stackoverflow.com/a/36254848/1298043

1

Se viene disattivata la variabile SDKROOT ambiente prima di chiamare lo script veloce, sarà quindi utilizzare l'OS X SDK.

Problemi correlati