如何通过命令行将文件添加到Xcode项目?Xcode中的project.pbxproj文件如何使用?

15 投票
3 回答
14634 浏览
提问于 2025-04-29 03:47

我想通过命令行把一个plist文件添加到Xcode项目中,有些博客建议我去编辑project.pbxproj文件。我查了一下这个project.pbxproj文件,但没找到太多信息。有没有人能告诉我这个project.pbxproj文件在Xcode中有什么用?怎么往里面添加内容呢?

我正在使用这个库来处理它。

我写的脚本如下:

import sys
import os
from mod_pbxproj import XcodeProject


def addPlistInProject(corodova_proj_name, xcode_proj_name, plist_file_name):
    print "Cordova project name : " + corodova_proj_name
    present_directory = os.getcwd()
    path_to_xcode_proj = present_directory + '/' + corodova_proj_name + '/platforms/ios/' + xcode_proj_name + '.xcodeproj/project.pbxproj'
    print "Xcode Project Path : " + path_to_xcode_proj
    project = XcodeProject.Load(path_to_xcode_proj)
    project.get_or_create_group('new group')
    project.add_file(plist_file_name)


if __name__ == "__main__":
    corodova_proj_name = sys.argv[1]
    xcode_proj_name = sys.argv[2]
    plist_file_name = sys.argv[3]
    print "Xcode Project Name = : " + xcode_proj_name
    print "Plist File Path = : " + plist_file_name
    addPlistInProject(corodova_proj_name, xcode_proj_name, plist_file_name)

我将这样调用这个脚本:

python myscript.py hello HelloWorld manisha-rules_camdo.plist

myscript.py是我写的脚本,hello是现有的cordova项目,HelloWorld是通过cordova platform add iOS创建的Xcode项目。

我将遵循的命令顺序如下:

cordova create hello com.example.hello HelloWorld
cordova platform add iOS
py myscript.py hello HelloWorld manisha-rules_camdo.plist

其中hello是cordova项目的名称,HelloWorld是iOS目标的名称。

暂无标签

3 个回答

3

你问的这个事情其实不是特别简单。Xcode的pbxproj文件格式看起来像是XML,但我觉得里面有很多专有的、没有文档说明的部分(就像iOS的其他东西一样)。据我所知,Xcode并没有提供从命令行添加文件的方式。

我找到一个Python脚本,可能可以用来修改Xcode的项目文件,但这个脚本有点年头了,可能已经过时了。

这里有一篇博客文章讲了这个脚本,还有这是当前的GitHub仓库(截至我写这个回答时,最后更新是在五个月前)。

你可以试试这个方法,告诉我是否有效。

8

另一个很不错的选择,特别是对于Cordova项目,就是使用XCODE这个节点模块:node-xcode;你可以通过NPM很方便地添加它。

一旦添加好,你可以创建一个after_prepare钩子,用来修改pbxproj文件,在每次构建时注入自定义的源文件、额外的框架等等。实际上,Cordova在自己的构建过程中也会用到这个模块。

在我的解决方案中,我首先通过npm添加了这个模块:

npm install xcode --save-dev

然后我创建了一个after_prepare钩子,把额外的框架添加到我的XCode项目中:

var xcode = require('xcode'),
    fs = require('fs'),
    rootdir = process.argv[2],
    projectPath = rootdir + '/platforms/ios/my-project/project.pbxproj',
    proj = new xcode.project(projectPath);

proj.parse(function(err) {
    if (err) {
        console.log("Oh noes! XCODE project failed to parse:");
        console.log(err);
    } else {
        proj.addFramework('Fabric.framework', {customFramework:true});
        proj.addFramework('Crashlytics.framework', {customFramework:true});
        proj.addFramework('AdSupport.framework');
        proj.addFramework('FacebookSDK.framework', {customFramework:true});

        fs.writeFileSync(projectPath, proj.writeSync());
        console.log("Updated XCODE project with references to social libs!");
    }
});

XCODE模块非常聪明,它会检查你想添加的框架、文件等是否已经存在,如果已经存在,它就不会再添加一遍。

9

Cocoapods 提供了一个 Ruby 的接口,可以用来编辑 Xcode 项目。这个接口背后还有一个活跃的开发者社区,大家可以在这里交流和分享经验。

https://github.com/CocoaPods/Xcodeproj

撰写回答