PlistBuddy无法识别plist文件中的CFBundleVersion键,求排查
PlistBuddy提示CFBundleVersion键不存在,但plist文件中确有该键的问题
使用PlistBuddy多年,近期在Xcode构建流程的Shell脚本环节中,PlistBuddy报错提示键“CFBundleVersion”不存在。已打印$PROJECT_DIR和$INFOPLIST_FILE的值,确认plist文件存在于指定目录,且文件内容中明确包含CFBundleVersion键(对应值为318)。
plist文件内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> <key>CFBundleHelpBookFolder</key> <string>FSHelp</string> <key>CFBundleHelpBookName</key> <string>File Synchronization Help</string> <key>CFBundleIdentifier</key> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string><HIDDEN></string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>$(MARKETING_VERSION)</string> <key>CFBundleSignature</key> <string>FSYN</string> <key>CFBundleVersion</key> <string>318</string> <key>LSApplicationCategoryType</key> <string>public.app-category.utilities</string> <key>LSHasLocalizedDisplayName</key> <true/> <key>LSMinimumSystemVersion</key> <string>${MACOSX_DEPLOYMENT_TARGET}</string> <key>NSMainNibFile</key> <string>MainMenu</string> <key>NSPrincipalClass</key> <string>NSApplication</string> </dict> </plist>
使用的Shell脚本内容
echo -n "PROJECT_DIR: ${PROJECT_DIR}" echo -n "INFOPLIST_FILE: ${INFOPLIST_FILE}" buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") buildNumber=$(($buildNumber + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
执行脚本后的输出
Command PhaseScriptExecution failed with a nonzero exit code PROJECT_DIR: /Users/laurent/Documents/Development/Personal/Mac OS X Projects/File Synchronization INFOPLIST_FILE: File Synchronization Apps Store-Info.plist Print: Entry, "CFBundleVersion", Does Not Exist
问题原因及解决方案
核心原因:路径拼接错误
你手动拼接${PROJECT_DIR}/${INFOPLIST_FILE}的方式存在隐患:
echo -n导致路径显示误导,实际脚本输出的两个变量内容是连在一起的,无法准确判断拼接后的真实路径;- Xcode中
INFOPLIST_FILE可能是相对路径,而PROJECT_DIR的指向可能和你预期的目录存在偏差,导致拼接后的路径并未指向你修改的那个plist文件。
解决方案
- 直接使用Xcode提供的完整路径变量
Xcode自带${INFOPLIST_PATH}变量,已经是plist文件的绝对路径,无需手动拼接,修改脚本如下:
echo "INFOPLIST_PATH: ${INFOPLIST_PATH}" buildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_PATH}") buildNumber=$(($buildNumber + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${INFOPLIST_PATH}"
- 修复调试用的echo命令
去掉echo -n,让每个变量单独一行显示,方便确认路径:
echo "PROJECT_DIR: ${PROJECT_DIR}" echo "INFOPLIST_FILE: ${INFOPLIST_FILE}" echo "Full plist path: ${PROJECT_DIR}/${INFOPLIST_FILE}"
- 添加文件存在性检查
在脚本中加入检查,确保操作的是正确的文件:
plistPath="${PROJECT_DIR}/${INFOPLIST_FILE}" if [ ! -f "$plistPath" ]; then echo "Error: Plist file not found at $plistPath" exit 1 fi
- 规范PlistBuddy命令格式
在键名前加上冒号:,明确指向根字典下的键,避免解析歧义:
# Print命令 /usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "plist路径" # Set命令 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion 新值" "plist路径"
内容的提问来源于stack exchange,提问作者Nemesys Software
相关产品推荐
相关产品推荐

