2012-10-11 77 views
5

estoy haciendo un script que modifica un proyecto de iOS de forma automática con el rubí. Después de agregar algunos archivos, necesito modificar el archivo project.pbxproj para guardar los cambios en el proyecto.Rubí modificar project.pbxproj

he encontrar un método para analizar el archivo pbxproj a JSON:

json = JSON.parse(`plutil -convert json -o - "#{filename}"`) 

Pero después de modificar el JSON, me gustaría revertir el proceso para guardar los cambios en el formato pbxproj. ¿Alguien sabe alguna forma de hacerlo?

Respuesta

1

No parece haber una forma de convertir directamente el JSON al formato de archivo pbxproj, pero Xcode leerá xml1 datos formateados como un archivo de proyecto válido.

Inspirado por la respuesta aceptada a Library to read/write pbxproj/xcodeproj files?, decidí intentar ejecutar con Xcode convertida JSON del proyecto. Xcode me dio un error al decir que el proyecto no era válido. Cuando convertí el JSON a XML usando plutil, Xcode lo leyó muy bien. Cuando observé el contenido del archivo, vi que se quedó en XML cuando Xcode lo cargó, pero en el momento en que cambié cualquier valor en Xcode, reescribí el archivo usando el formato pbxproj. Parecía reordenar el orden de los marcos y las bibliotecas, pero eso puede deberse a que el pbxproj original con el que estaba trabajando fue generado por Unity3D.

Esta es una receta aproximada de cómo convertir de forma automática, manipular, y posteriormente utilizar el archivo pbxproj:

#!/bin/sh 
plutil -convert json -r -o project.json -- project.pbxproj 
ruby my_script.rb <project.json> project-modified.json 
plutil -convert xml1 -o project-modified.xml -- project-modified.json 
cp project-modified.xml project.pbxproj 

No sé si hay una manera más fácil-automatible tener Xcode llevar el modificado vuelva a su formato original, pero debería estar bien invocar xcodebuild o xcrun mientras el archivo está en formato XML.

+0

También descubrí que 'plutil' es exigente con el fin de' '-convert' y -o'. Lanzará un error si coloca '-o' primero. – amacleod