Добавить файлы в проект Xcode через командную строку? Использование файла project.pbxproj в Xcode?

Я пытался добавить файл plist в проект xcode через командную строку, некоторые из блогов предложили отредактировать файл project.pbxproj. Я искал файл project.pbxproj, но не смог получить много информации об этом. Может ли кто-нибудь сообщить мне, что использует файл project.pbxproj в xcode? Как добавить в него записи?

Я использую это репо для работы с ним.

script, который я написал, выглядит следующим образом:

import sys
import os
from mod_pbxproj import XcodeProject


def addPlistInProject(corodova_proj_name, xcode_proj_name, plist_file_name):
    print "Cordova project name : " + corodova_proj_name
    present_directory = os.getcwd()
    path_to_xcode_proj = present_directory + '/' + corodova_proj_name + '/platforms/ios/' + xcode_proj_name + '.xcodeproj/project.pbxproj'
    print "Xcode Project Path : " + path_to_xcode_proj
    project = XcodeProject.Load(path_to_xcode_proj)
    project.get_or_create_group('new group')
    project.add_file(plist_file_name)


if __name__ == "__main__":
    corodova_proj_name = sys.argv[1]
    xcode_proj_name = sys.argv[2]
    plist_file_name = sys.argv[3]
    print "Xcode Project Name = : " + xcode_proj_name
    print "Plist File Path = : " + plist_file_name
    addPlistInProject(corodova_proj_name, xcode_proj_name, plist_file_name)

Я буду ссылаться на script как:

python myscript.py hello HelloWorld manisha-rules_camdo.plist

myscript.py - это script Я написал: hello - это существующий проект cordova, а HelloWorld - проект Xcode, созданный с помощью cordova platform add iOS.

Последовательность команд я будет следующей:

cordova create hello com.example.hello HelloWorld
cordova platform add iOS
py myscript.py hello HelloWorld manisha-rules_camdo.plist

Где hello - название проекта cordova и HelloWorld имя цели iOS.

Ответ 1

Для редактирования проектов Xcode существует API Ruby от Cocoapods. Он также имеет активное сообщество разработчиков:

https://github.com/CocoaPods/Xcodeproj

Ответ 2

То, что вы просите, - это не самая простая вещь. Формат файла Xcode pbxproj выглядит как XML, но я думаю, что в нем есть немало проприетарных/недокументированных частей (как и все iOS). Насколько я могу судить, Xcode не имеет возможности добавлять файлы из командной строки.

Я нашел Python script, который вы могли бы использовать для изменения файлов проекта XCode, но ему несколько лет, и он может быть устаревшим.

Вот сообщение в блоге, в котором говорится об этом, и вот текущее GitHub-репо (последнее обновление обновлено пять месяцев назад, с того момента, как я набрал этот ответ).

Попробуйте и дайте мне знать, если это сработает для вас.

Ответ 3

Еще один отличный вариант, особенно для проектов Cordova, - использовать модуль XCODE node: node-xcode; вы можете легко добавить его через NPM.

После этого вы можете создать привязку after_prepare, чтобы изменить pbxproj, вставляя пользовательские исходные файлы, дополнительные фреймворки и т.д. в каждую сборку. Фактически, сама Кордова использует этот модуль во время собственных процессов сборки.

В моем решении я сначала добавил модуль через npm:

npm install xcode --save-def

И затем я создал и after_prepare, чтобы добавить дополнительные фреймворки в мой проект XCode:

var xcode = require('xcode'),
    fs = require('fs'),
    rootdir = process.argv[2],
    projectPath = rootdir + '/platforms/ios/my-project/project.pbxproj',
    proj = new xcode.project(projectPath);

proj.parse(function(err) {
    if (err) {
        console.log("Oh noes! XCODE project failed to parse:");
        console.log(err);
    } else {
        proj.addFramework('Fabric.framework', {customFramework:true});
        proj.addFramework('Crashlytics.framework', {customFramework:true});
        proj.addFramework('AdSupport.framework');
        proj.addFramework('FacebookSDK.framework', {customFramework:true});

        fs.writeFileSync(projectPath, proj.writeSync());
        console.log("Updated XCODE project with references to social libs!");
    }
});

Модуль XCODE достаточно умен, чтобы узнать, присутствуют ли уже существующие фреймворки/файлы/etc, которые вы пытаетесь добавить, и не будете пытаться добавить их снова.