如何使用 PlistBuddy 添加设置而不覆盖现有设置?
Posted
技术标签:
【中文标题】如何使用 PlistBuddy 添加设置而不覆盖现有设置?【英文标题】:How can I use PlistBuddy to add settings without overriding existing ones? 【发布时间】:2015-12-22 15:43:52 【问题描述】:我正在尝试编写一个脚本,在构建期间将设置添加到设置应用程序,而不覆盖现有的设置(如果存在)。这是我的脚本的 sn-p:
PLISTBUDDY="/usr/libexec/PlistBuddy"
SETTINGSBUNDLEPATH="$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:0:Type string 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:0:Title string 'Version Information'" "$SETTINGSBUNDLEPATH"
||
$PLISTBUDDY -c "Set :PreferenceSpecifiers:0:Type 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:0:Title 'Version Information'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Type string 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Title string 'Version:'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:Key string 'appVersion'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:1:DefaultValue string '$APPVERSION'" "$SETTINGSBUNDLEPATH"
||
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Type 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Title 'Version:'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:Key 'appVersion'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Set :PreferenceSpecifiers:1:DefaultValue '$APPVERSION'" "$SETTINGSBUNDLEPATH"
不过,我不想覆盖任何现有设置。 如何将这些设置添加到 PreferenceSpecifiers 的末尾?
我已阅读documentation,并尝试使用 Merge 没有成功。
$PLISTBUDDY -c "Merge $PROJECT_DIR/Settings1.bundle/Root.plist" "$SETTINGSBUNDLEPATH"
编辑:在代码中添加了“try-catch”,这解决了运行脚本两次时的问题。
【问题讨论】:
等一下,$CODESIGNING_FOLDER_PATH
将包含一些与构建机器相关的文件夹,而您正在将该文件夹名称构建到应用程序中?警钟正在敲响……
这样不行吗?写到那里似乎要容易得多,因为我只想根据构建配置添加某些设置。
我想我搞错了。您正在该文件夹中设置 .plist
以包含在应用程序中,这是完全合理的。抱歉弄错了。
【参考方案1】:
这首先计算所有字典 PreferenceSpecifiers,如 these answers。然后它将遍历字典并检查组是否已经存在,因此当您第二次构建应用程序时,脚本不会再次添加行。如果未找到该组,它将在最后一个索引之后添加行。我不确定的一件事是为什么 count 不是数字以及如何正确修复它(当前代码有效)。
PLISTBUDDY="/usr/libexec/PlistBuddy"
SETTINGSBUNDLEPATH="$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"
count=`$PLISTBUDDY -c "Print PreferenceSpecifiers:" $SETTINGSBUNDLEPATH | grep "Dict"|wc -l`
let count++
let count--
FOUND=false
for index in `seq 0 $count`
do
val=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$index:Key" $SETTINGSBUNDLEPATH`
if [ "$val" == "versionInfo" ]; then
FOUND=true
break
fi
done
if [ "$FOUND" == false ]; then
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Type string 'PSGroupSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Title string 'Version Information'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Key string 'versionInfo'" "$SETTINGSBUNDLEPATH"
let count++
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Type string 'PSTitleValueSpecifier'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Title string 'Version:'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:Key string 'appVersion'" "$SETTINGSBUNDLEPATH"
$PLISTBUDDY -c "Add :PreferenceSpecifiers:$count:DefaultValue string '$APPVERSION'" "$SETTINGSBUNDLEPATH"
fi
【讨论】:
以上是关于如何使用 PlistBuddy 添加设置而不覆盖现有设置?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PlistBuddy 将多个条目添加到 plist 字典