Библиотека для чтения / записи файлов pbxproj/xcodeproj?

Кто-нибудь знает библиотеки для чтения / записи файлов проекта Xcode .xcodeproj /.pbxproj? Любой язык приветствуется.

Заранее спасибо.

8 ответов

Решение

Поверхностный синтаксис проекта Xcode - "старый стиль". Вы можете легко преобразовать его в XML-лист с помощью команды

plutil -convert xml1 -o - myproj.xcodeproj/project.pbxproj

Обратите внимание, что это не "настоящий XML", а структура списков Mac OS X, выраженная в синтаксисе XML; он состоит почти полностью из парных словарей и массивов ключ-значение. Xcode прочитает представление XML, но преобразует его обратно в "plist старого стиля" при открытии проекта.

Структура и взаимосвязь элементов в листе соответствуют структуре проекта. UUID используются для перекрестной ссылки на элементы между проектом и его целями, а также между проектом и пользовательскими файлами в оболочке проекта.

Ключ isa идентифицирует каждый вид объекта. PBXProject содержит объекты PBXFileReference, PBXGroup, PBXNativeTarget и PBXBuildConfiguration.

У целей есть объекты PBXBuildPhase, которые содержат перекрестные ссылки на ссылки на файлы; BuildConfigurationLists хранят параметры сборки для целей и другие параметры цели, такие как тип и имя цели.

BuildConfigurationLists перекрестные ссылки buildConfigurations, которые, в свою очередь, содержат словари buildSettings.

Я бы порекомендовал сначала взглянуть на текст в старом стиле, так как он гораздо более читабелен и содержит встроенные комментарии, чтобы рассказать, что к чему. Затем вы можете использовать инструменты XML для редактирования или записи файлов проекта по своему вкусу.

Я закончил тем, что создал один, и он размещен на github здесь:

https://github.com/jasperblues/XcodeEditor

Позволяет перечислять заголовки, файлы, добавлять исходные файлы, устанавливать исходный файл в качестве члена цели, добавлять изображения, создавать группы и т. Д.).

Он работает, манипулируя содержимым файла project.pbxproj. Используется в:

  • Менее болезненно: Автоматическое функциональное тестирование для мобильных приложений. (Изменить: теперь часть инструментов Xamarin).
  • Level Helper: RAD-фреймворк для разработки 2D-игр на iOS и Android.
  • TextMate
  • Apportable

Я только что обнаружил это: https://github.com/alunny/node-xcode Я еще не использовал его, но он выглядит многообещающим для разработчиков Node.js.

Попробуйте это: https://github.com/sap-production/XcodeProjectJavaAPI

Он может читать и записывать любой файл списка свойств и содержит семантическую модель для чтения и управления файлами проекта Xcode. Семантическая модель находится на ранней стадии, но может быть легко расширена.

Он также активно используется в плагине Xcode Maven SAP, который будет выпущен в этом месяце.

Вы также можете рассмотреть возможность использования команды PlistBuddy:

https://marcosantadev.com/manage-plist-files-plistbuddy/

http://scriptingosx.com/2016/11/editing-property-lists/

CocoaPods теперь имеет библиотеку ruby ​​для управления файлами pbxproj:

https://github.com/CocoaPods/Xcodeproj

Помимо использования CocoaPods, он также используется fastlane, synx, slather и, несомненно, многими другими.

Для этого есть хороший пакет Python. Документация не очень хорошая, но исходный код довольно организован, и вы можете найти то, что вам нужно.

https://github.com/kronenthaler/mod-pbxproj

Для PHP (легко переносимого на любой язык, который вам нужен), только базовая запись:

function modifyPlistXCodeProject($file_path,$app_name,$bundle_identifier,$latest_version,$bundle_version)
{
    $data = file_get_contents($file_path);
    $changes = Array();
    $changes['PRODUCT_BUNDLE_IDENTIFIER'] = $bundle_identifier;
    foreach ($changes as $key => $value){
        $data = oldStylePlistReplace($data,$key,$value);
    }
    file_put_contents($file_path, $data);
}

function oldStylePlistReplace($data,$key,$value){
    $e = explode($key,$data);
    for ($i=1;$i<count($e);$i++){
        $row_i = $e[$i];
        $nextline_pos = stripos($row_i,"\n");
        $text_i = '= '.$value.';'.substr($row_i, $nextline_pos);
        $e[$i] = $text_i;
        //var_dump(substr($text_i,0,100));exit();
    }
    return implode($key,$e);
}
Другие вопросы по тегам