库读/写pbxproj / xcodeproj文件?

时间:2009-09-21 03:04:29

标签: java objective-c ruby xcode macos

有没有人知道要读取/写入Xcode项目文件的库 .xcodeproj / .pbxproj?欢迎任何语言。

提前致谢。

8 个答案:

答案 0 :(得分:29)

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对象。

目标包含PBXBuildPhase对象,这些对象包含对文件引用的交叉引用; BuildConfigurationLists,用于存储目标的构建设置,以及其他目标设置,如目标类型和名称。

buildConfigurationLists交叉引用buildConfigurations,后者又包含buildSettings的字典。

我建议首先查看旧式plist文本,因为它更具可读性,实际上有内联注释来告诉你什么是什么。然后,您可以使用XML工具根据自己的喜好编辑或编写项目文件。

答案 1 :(得分:21)

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

https://github.com/jasperblues/XcodeEditor

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

它的工作原理是操作project.pbxproj文件的内容。用于:

  • 痛苦减轻:移动应用程序的自动功能测试。 (编辑:现在是Xamarin工具的一部分)。
  • Level Helper:用于在iOS和iOS上开发2D游戏的RAD框架机器人。
  • TextMate的
  • Apportable

答案 2 :(得分:5)

我刚刚发现了这个:https://github.com/alunny/node-xcode我还没有使用过它,但对于Node.js的开发人员而言看起来很有希望。

答案 3 :(得分:3)

答案 4 :(得分:3)

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

它可以读取和写入任何Property List文件,并包含一个语义模型来读取和操作Xcode Project文件。语义模型处于早期阶段,但可以很容易地扩展。

它也在SAP的Xcode Maven插件中大量使用,该插件将于本月发布。

答案 5 :(得分:3)

CocoaPods现在有一个ruby库来操作pbxproj文件:

https://github.com/CocoaPods/Xcodeproj

除了被CocoaPods使用之外,fastlanesynxslather也使用了这一点,毫无疑问还有更多。

答案 6 :(得分:2)

这是一个很好的Python包。文档不是很好,但源代码非常有条理,你可以找到你需要的东西。

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

答案 7 :(得分:-1)

对于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);
}