最近的需要做一个自动打包各个子模块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的有文档,也有很多的资料,这里有不赘述了,有需要的可以看下面的链接:
最后简单的上下代码:
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语言确实非常的好用,简单易读,很优雅~ 有空的可以学学~