objective c - saber - ¿Cómo agrupar un paquete de rubíes en una aplicación de cacao[Objective-C]?
piedras preciosas precios (2)
Estoy intentando descubrir cómo podría combinar 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 haya una manera fácil de puente ObjC <-> Cacao que no conozco).
El paquete Sass es algo que tienes que instalar, usando "gem install" o "rake install"; al hacerlo, coloca un montón 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 tan familiarizado con las funciones internas y la estructura de Ruby (¡Lo siento, tengo problemas para guardar ObjC / Cocoa en mi cabeza!) , No está claro para mí cuál de los 1,444 archivos que se instalaron en el ~ / .gem directory (Sí, conté) Necesito incrustar en la aplicación y lo que podría necesitar para hacer que las referencias de directorio, etc. funcionen correctamente.
Si alguien tiene alguna experiencia con la incrustación de una herramienta Ruby en una aplicación Cocoa, realmente agradecería su opinión. No esperaba que esto fuera tan difícil, teniendo en cuenta que Ruby está instalado en Mac OS X ... pero aparentemente este paquete es (típicamente? Atípicamente?) Más que un solo archivo de script ....
Puede instalar gemas en una ubicación específica:
GEM_HOME=path/to/your/project/gems gem install sass
Luego, como parte de su proceso de compilación, copie la carpeta en sus recursos. Cuando quieras ejecutar sass, encuentra tu carpeta de gemas. Llama a ruby como 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 también le conviene agrupar ruby (quizás 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.
Muchas gracias a @Jacob Lukas , encontré que simplemente al configurar GEM_HOME en gem install <gem>
no adjuntó correctamente las dependencias. Entonces, en mi caso, donde solo necesito ejecutar un script genero en un plugin Xcode, terminé con:
gem install -i ~/xCodeProjects/PluginOne/gems xcodeproj --verbose
para obtener la (s) gema (s) y 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];