Какие инструменты поддерживают редактирование файлов project.pbxproj?

Я хочу редактировать project.pbxproj прямо из командной строки (для скрипта CI-сервера)

какие инструменты могут позволить мне сделать это?

Я использовал, чтобы использовать PlistBuddy редактировать вывод Info.plist; однако, что я действительно хочу сделать, это отредактировать это пользовательское поле, которое используется в нескольких местах, и я действительно не хочу выискивать это в каждом местоположении plist

2 ответа

Решение

Может быть, вы пошли не в ту сторону. Если у вас есть часто меняющийся параметр, его легче выполнить в * .plist в качестве настройки. Замена значения в * .plist гораздо проще, чем редактировать файл проекта или передать пользовательское поле. В моем проекте у меня есть настройки server_address который помещен в configuration.plist,

1) Когда приложение запускается, просто загрузите конфигурацию один раз и распространите настройки:

- (NSDictionary *)loadConfigFromPlist:(NSString *)plistName {
    NSURL *plistUrl = [[NSBundle bundleForClass:[self class]] URLForResource:plistName withExtension:@"plist"];

    if (!plistUrl) {
        @throw [NSException exceptionWithName:@"InaccessibleFileException"
                                       reason:[NSString stringWithFormat:@"Unable to read config from '%@'", plistName]
                                     userInfo:nil];
    }

    NSDictionary *config = [NSDictionary dictionaryWithContentsOfURL:plistUrl];
    return config;
}

2) При настройке CI необходимо добавить шаг сборки для пользовательского скрипта (после обновления исходников из git/svn), например, для teamcity CI:

echo "Check a condition - change server address"

if [ "true" = "%env.is_change_serveraddress%" ]; then
  echo "env.is_change_serveraddress = %env.is_change_serveraddress%"
  echo "Setup a custom server address: %env.server_address%"
  /usr/libexec/plistbuddy -c "Set :WebClient:Constants:WebServerAddress %env.server_address%" "configuration.plist"
else
  echo "env.is_change_serveraddress = %env.is_change_serveraddress%"
fi

project.pbxprojтакже является файлом списка свойств ASCII старого стиля. Итак, вы можете использовать/usr/libexec/PlistBuddy отредактировать его.

Выведите значение определенного пользователем ключа, например,

# Get the key A83311AA20DA4A80004B8C0E in your project.pbxproj
# LZD_NOTIFICATION_SERVICE_BUNDLE_ID is defined by me,
# Replace key paths with your own.
/usr/libexec/PlistBuddy -c 'print :objects:A83311AA20DA4A80004B8C0E:buildSettings:LZD_NOTIFICATION_SERVICE_BUNDLE_ID' LAAppAdapter.xcodeproj/project.pbxproj

Установите его значение следующим образом:

/usr/libexec/PlistBuddy -c 'set :objects:A83311AA20DA4A80004B8C0E:buildSettings:LZD_NOTIFICATION_SERVICE_BUNDLE_ID com.dawnsong.notification-service' LAAppAdapter.xcodeproj/project.pbxproj

Я знаю, что на это уже давно дан ответ, но поскольку первоначальный вопрос касается инструментов, поддерживающих манипулирование .pbxproj файлы и многие другие люди могут искать ту же информацию, вот как я это делаю. Мне потребовалось довольно много времени, чтобы понять это, потому что я был очень незнаком с XCode, когда начал пытаться сделать это, поэтому я надеюсь, что это спасет других от горя, которые мне пришлось потратить.

Вы можете использовать plutil Команда для преобразования .pbxproj файл из наследия .plist Формат в формате XML или JSON, вы сможете управлять проще. Я использую JSON. Для этого просто запустите:

plutil -convert json project.pbxproj

Это преобразует формат project.pbxproj, но учтите, что - вопреки здравому смыслу - на выходе не будет другого файла с расширением JSON, такого как project.json, Что будет то project.pbxproj будет преобразован в формат JSON, но сохранит его загадочным .pbxproj расширение. Таким образом, даже несмотря на то, что формат файла был изменен, XCode все равно подберет его и будет использовать его в новом формате JSON.

Тогда вы можете изменить project.pbxproj с легкостью, используя любой инструмент управления JSON по вашему выбору. Я использую Groovy's JsonSlurper класс в Groovy сценарии.

Обратите внимание, что я также изучил опцию XML, но я нашел project.pbxproj файл в формате XML, который будет громоздким для анализа. Элементы неправильно вложены, чтобы можно было с легкостью обходить дерево. Это страдает с:

<key>someKey</key>
<dict>
    <!--More elements which provide configuration for the key above-->
</dict>

Так что это позиционный характер. Вы должны искать key элемент, соответствующий настройке, которую вы хотите манипулировать, а затем перейти к dict элемент сразу после него. Это означает, что вы должны смонтировать дочерние элементы каждого элемента XML в массив, чтобы проиндексировать их.

Вот 3 инструмента с открытым исходным кодом, которые реализуют редактирование файла.pbxproj:

Другие вопросы по тегам