代码之家  ›  专栏  ›  技术社区  ›  JP Richardson

要读取/写入pbxproj/xcodeproj文件的库?[关闭]

  •  22
  • JP Richardson  · 技术社区  · 15 年前

    有人知道读/写Xcode项目文件的库吗? XCODEPROJ// PBXPROJ?欢迎使用任何语言。

    事先谢谢。

    8 回复  |  直到 7 年前
        1
  •  28
  •   cdespinosa Martin Cote    15 年前

    Xcode项目的表面语法是一个“老式plist”,您可以用命令轻松地将其转换为XML plist。

    plutil -convert xml1 -o - myproj.xcodeproj/project.pbxproj
    

    注意,这不是“真正的XML”,而是用XML语法表示的mac os x plist结构;它几乎完全由键值对字典和数组组成。Xcode将读取XML表示,但在打开项目时将其转换回“旧样式plist”。

    plist中项目的结构和关系遵循项目的结构。UUID用于在项目与其目标之间以及项目包装器中的项目与用户文件之间交叉引用项。

    “isa”键标识每种对象。pbxProject包含pbxfilereference、pbxgroup、pbxNativeTarget和pbxBuildConfiguration对象。

    目标具有包含对文件引用的交叉引用的pbxbuildsphase对象;存储目标的生成设置的buildconfigurationList,以及其他目标设置(如目标类型和名称)。

    buildconfiguration列出了交叉引用的buildconfiguration,后者依次包含buildsettings的字典。

    我建议先看一下旧样式的plist文本,因为它更具可读性,而且实际上有内联注释来告诉您什么是什么。然后,您可以使用XML工具编辑或写入您喜欢的项目文件。

        2
  •  21
  •   Jasper Blues    11 年前

    我最终创建了一个,它在Github上托管:

    https://github.com/jasperblues/XcodeEditor

    允许列出标题、文件、添加源文件、将源文件设置为目标的成员、添加图像、创建组等)。

    它通过操作project.pbxproj文件的内容来工作。用于:

    • 不那么痛苦:移动应用程序的自动功能测试。(编辑:现在是Xamarin工具的一部分)。
    • 级别助手:用于在iOS和Android上开发二维游戏的RAD框架。
    • 文本伴侣
    • Apportable
        3
  •  5
  •   JP Richardson    12 年前

    我刚刚发现了: https://github.com/alunny/node-xcode 我还没有使用它,但是对于node.js开发人员来说,它看起来很有前途。

        4
  •  3
  •   Alexander    12 年前

    试试这个: https://github.com/sap-production/XcodeProjectJavaAPI

    它可以读取和写入任何属性列表文件,并包含一个语义模型来读取和操作Xcode项目文件。语义模型处于早期阶段,但易于扩展。

    SAP的xcode maven插件中也大量使用了它,该插件将于本月发布。

        5
  •  3
  •   JosephH    9 年前

    Cocoapods现在有一个Ruby库来操作pbxproj文件:

    https://github.com/CocoaPods/Xcodeproj

    除了被椰子使用外,它还被 fastlane ,请 synx , slather 毫无疑问还有很多。

        7
  •  2
  •   Sandy Chapman    9 年前

    有一个很好的python包。文档不是很好,但源代码组织得很好,您可以找到所需的内容。

    https://github.com/kronenthaler/mod-pbxproj

        8
  •  -1
  •   user1122069    9 年前

    对于PHP(很容易移植到您需要的任何语言),非常基本的只写:

    function modifyPlistXCodeProject($file_path,$app_name,$bundle_identifier,$latest_version,$bundle_version)
    {
        $data = file_get_contents($file_path);
        $changes = Array();
        $changes['PRODUCT_BUNDLE_IDENTIFIER'] = $bundle_identifier;
        foreach ($changes as $key => $value){
            $data = oldStylePlistReplace($data,$key,$value);
        }
        file_put_contents($file_path, $data);
    }
    
    function oldStylePlistReplace($data,$key,$value){
        $e = explode($key,$data);
        for ($i=1;$i<count($e);$i++){
            $row_i = $e[$i];
            $nextline_pos = stripos($row_i,"\n");
            $text_i = '= '.$value.';'.substr($row_i, $nextline_pos);
            $e[$i] = $text_i;
            //var_dump(substr($text_i,0,100));exit();
        }
        return implode($key,$e);
    }