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

  • 0
    いいね
  • 0
    コメント
    この記事は最終更新日から1年以上が経過しています。

    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ファイルが生成されているかなどを確認するのが良さそうでした。