Set: Entry, ":xxxxx", Does Not Exist と言われてしまった時の話

More than 1 year has passed since last update.

iOS全く書かないのですが、少しXCodeを触った時にエラーの原因がわからなかったのでその時のメモです

概要

XCodeでArchiveしようとした時、RunScript内でエラーが起きてしまって止まってました
エラー内容はこんな感じ

Set: Entry, ":CFBundleVersion", Does Not Exist File Doesn't Exist

scriptを追ってみて実際に再現させてみたところPlistBuddyコマンドでエラーが起きているようでした。

$/usr/libexec/PlistBuddy -c "Set :CFBundleVersion xxx" hoge.plist
Set: Entry, ":CFBundleVersion", Does Not Exist

$cat hoge.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>hoge</key>
    <string>foo</string>
</dict>
</plist>

原因と対策?

ヘルプとかみたり色々試した結果、そもそもplistファイル内に該当のkeyがなければエラーになるんですね。

$cat hoge.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>hoge</key>
    <string>foo</string>
</dict>
</plist>

$/usr/libexec/PlistBuddy -c "Set :fuga foo" hoge.plist
Set: Entry, ":fuga", Does Not Exist

$/usr/libexec/PlistBuddy -c "Add :fuga string a" hoge.plist

$cat hoge.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>fuga</key>
    <string>a</string>
    <key>hoge</key>
    <string>foo</string>
</dict>
</plist>

$/usr/libexec/PlistBuddy -c "Set :fuga bar" hoge.plist

$cat hoge.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>fuga</key>
    <string>bar</string>
    <key>hoge</key>
    <string>foo</string>
</dict>
</plist>

plistファイル自体は別で作られたりするのかもしれないですが、
もしこのエラーが起きた場合、ファイル内に該当のキーが存在しないことがエラーです。
なので、どこかでplistファイルが生成されている場合、
意図通りplistファイルが生成されているかなどを確認するのが良さそうでした。