2010-06-19 22 views
8

Estoy tratando de descubrir cómo podría agrupar un paquete, escrito en Ruby (Sass) en una aplicación Cocoa (Objective-C, no Ruby Cocoa) para que lo ejecute (a través de NSTask está bien, a menos que sea fácil forma de puente ObjC < -> Cacao que no conozco).¿Cómo agrupar un paquete de rubíes en una aplicación de cacao [Objective-C]?

El paquete Sass es algo que tiene que instalar, usando "instalación de gema" o "instalación de rake" - al hacerlo pone ton de archivos en mi directorio ~/.gem. Como quiero que cualquiera que haya instalado mi aplicación basada en Cocoa pueda ejecutar esta herramienta desde mi aplicación, no quiero que el usuario realice un proceso de instalación de algo adicional, por lo que espero poder para insertar todo lo que necesito en el directorio de Recursos de mi paquete de aplicaciones.

Sin embargo, al no estar familiarizado con el funcionamiento interno y la estructura de Ruby (Lo siento, estoy teniendo problemas para simplemente mantener ObjC/Cacao en mi cabeza!), no es claro para mí simplemente cuál de los archivos de 1.444 que se instaló en el directorio ~/.gem (Sí, conté) Necesito incrustar en la aplicación y lo que podría necesitar hacer para obtener las referencias de directorio, etc. funcionando bien.

Si alguien tiene alguna experiencia con la incrustación de una herramienta Ruby en una aplicación Cocoa, agradecería mucho su opinión. No esperaba que esto fuera tan difícil, teniendo en cuenta que el ruby ​​está instalado en Mac OS X ... pero aparentemente este paquete es (típicamente? Atípicamente?) Más que un solo archivo de script ....

Respuesta

1

puede instalar gemas en una ubicación específica:

GEM_HOME=path/to/your/project/gems gem install sass 

Entonces, como parte de su proceso de construcción, copie la carpeta en sus recursos. Cuando quieras ejecutar sass, encuentra tu carpeta de gemas. Rubí llamar así:

NSString *gems_path = …; 
NSTask *task = [[NSTask alloc] init]; 
// you may want to copy NSProcessInfo.processInfo.environment and modify it instead 
task.environment = @{ @"GEM_HOME": gems_path }; 
task.launchPath = @"/usr/bin/ruby"; 
task.arguments = @[[gems_path stringByAppendingPaths:@[@"bin",@"sass"]], @"rest", @"of", @"your", @"arguments"]; 
// add handling for I/O 
[task launch]; 

(escrito en GitHub, puede tener errores tontos)

Tenga en cuenta que es posible que desee agrupar rubí así (tal vez MacRuby), para evitar problemas de compatibilidad. De lo contrario, asegúrese de probar todas las versiones de OS X que admite, especialmente la 10.9, ya que Ruby se actualizó a 2.0.

1

Muchas gracias a @Jacob Lukas, encontré que simplemente estableciendo GEM_HOME en gem install <gem> no adjunté correctamente las dependencias. Por lo tanto, para mi caso -, donde sólo hay que ejecutar un script que estoy generando en un plugin de Xcode - Terminé con:

gem install -i ~/xCodeProjects/PluginOne/gems xcodeproj --verbose

para conseguir la gema (s) & dependencias. Entonces, utilicé:

NSString *gems_path = [[bundle resourcePath] stringByAppendingString:@"/gems"]; 

NSTask *task = [[NSTask alloc] init]; 
task.environment = @{ @"GEM_HOME" : gems_path }; 
task.launchPath = @"/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby"; 
task.arguments = @[generatedRubyFilePath]; 

[task launch]; 
Cuestiones relacionadas