Какие инструменты поддерживают редактирование файлов 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:
- https://github.com/CocoaPods/Xcodeproj (на основе Ruby)
- https://github.com/apache/cordova-node-xcode (на основе NodeJS)
- https://github.com/kronenthaler/mod-pbxproj (на основе Python)