使用xcodeproj为工程添加framework

1,951 阅读2分钟

最近的需要做一个自动打包各个子模块framework的脚本。写脚本嘛,思路很简单,把平时那些手动的操作转化成代码就可以。

步骤也很简单,平时打一个framework的时候需要:

1.在工程 linked Frameworks and Libraries 中添加所需要的framework

2.修改podfile文件,然后执行pod install 命令

3.执行打包framework的脚本,输入子模块名称做为参数

4.提交代码至子模块git仓库,reset掉中间产生的无用代码

想了下这个步骤,唯一有点难度的就是 给工程添加framework,之前做过修改XCode中build Setting的相关设置,感觉应该差不多。但是做的时候问题就出现了,问题来自xcodeproj文件

简单介绍下xcodeproj文件。 

首先这是个类似于ipa的包,显示包内容或者直接拖到sublime3中打开,可以看到里面的结构,其中就有我们今天的主角:project.pbxproj。

project.pbxproj采用的是老式风格的plist文件(old ASCII plist)。就是由很多 节点{ 内容 } 节点 { 内容 } 组成的,大多数的内容如之前修改build setting的内容,就想当于key-value;找到对应的key之后修改value就可以了,github上有很多的工具。

293EFECE17BB1F2100A264A1 /* Release */ = {

isa = XCBuildConfiguration;

baseConfigurationReference = 5FFFEAC8FAEB3F5B5524ED1D /* Pods.release.xcconfig */;

buildSettings = {

ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

CLANG_CXX_LANGUAGE_STANDARD = "compiler-default";

CLANG_CXX_LIBRARY = "compiler-default";

CLANG_ENABLE_MODULES = YES;

CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;

...

}

然而在给xcodeproj添加资源或者文件的时候就不一样了。资源大多数是这样的 :

012EEC861DACDC6F007833C4 /* XXXView.m in Sources */ = {isa = PBXBuildFile; fileRef = 012EEC5C1DACDC6F007833C4 /* XXXView.m */; };

这里面就出现了个比较蛋疼的东西 就是 012EEC861DACDC6F007833C4 这个标识符,查了下发现这个是唯一标识符,苹果默认生成与资源一一对应的。所以我们添加资源的时候需要生成唯一标识符,这个技术难度就比较大了。

在遇到这个问题的时候想到了NB的cocoapods,cocoapods最后也是生成了一个.a文件然后添加到工程中,那么cocoapods应该也有实现的方法。

经过一系列的search之后,找到了cocoapods中的xcodeproj框架,专门用于添加资源文件的。

xcodeproj的有文档,也有很多的资料,这里有不赘述了,有需要的可以看下面的链接:

draveness.me/bei-xcodepr…

blog.wtlucky.com/blog/2016/1…

github.com/CocoaPods/X…

最后简单的上下代码:

target为:子模块framework的名称

path = $iphonePath + '/XXX.xcodeproj' # the project_path

project = Xcodeproj::Project.open(path)

projectTarget = project.targets.first

targetFramework = target + 'Framework'

targetPath = $reposPath + target + '/' + targetFramework + '/' + target + '.framework'

reference = project.frameworks_group.new_reference(targetPath)

projectTarget.frameworks_build_phase.add_file_reference(reference, true)

题外话:

ruby语言确实非常的好用,简单易读,很优雅~ 有空的可以学学~