上回书我们扫了一下界面的坑,这回扫一下打包命令的坑。
首先呢让我们先大概梳理一下自动打包的流程:
一、制定代码仓库地址
二、选择分支
三、获得最新代码
四、clean清除其他编译结果
五、build代码获得可执行文件
六、打包程序
至于其他的功能我会在后面做的时候陆续讲解的,目前先讨论打包相关的命令。
自动打包程序,自然要调用各种命令。那么 mac 程序如何调用命令,就是首当其冲的问题。现在有两种方案(一)使用NSAppleScript调用applescript脚本。(二)使用NSTask调用其他程序。
考虑了一下自身简陋的条件和以后准备加入的远程打包功能,最终的选择是使用NSTask执行写好的shell脚本进行打包。
NSTask *task = [[NSTask alloc] init];
task.launchPath = Path;
task.arguments = Arguments;
NSPipe *pipe; pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
result = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
result 获得执行的结果,这是执行连续的动作必要条件。
(第四坑)
那接下里啊让我们按着思路将代码写出来,第一个shell。
#!/bin/sh
mkdir $1
cd $1
svn checkout $2
exit 0
先创建一个目录,cd 到该目录,checkout 相应的代码。一切都是那么的顺利,可是执行的时候却失败了,仔细回想一下发现原来是自己落掉了很重要的一步。给shell脚本可执行权限
chmod 777 xxx.sh
(第五坑)
这个坑真是困扰了我很久我在 Terminal 中执行 xcodebuild 这个命令的时候非常顺利,我就开开心心的写好了shell脚本,但是放到了xcode里执行每次都报错,输出结果在生成符号文件的时候, xcode 自带的GenerateDSYMFile程序发生了崩溃,一下就懵了。
The following build commands failed:
GenerateDSYMFile /Users/talon/Library/Developer/Xcode/DerivedData/ToumiClient-gdkkatrhqtzqpnaxzobeqbspcxka/Build/Products/Adhoc-iphoneos/ToumiClient.app.dSYM /tmp/ToumiClient.dst/Applications/ToumiClient.app/ToumiClient
通过百度的介绍我搜到了一种方法,就是在工程文件的build Options中修改为不生成dSYM文件,尝试了一下确实可行,但是基于要力求完美的原因,最终还是放弃了这个方案。
打定主意以后,查了很多资料,最后终于依靠万能的谷歌(PS:不是我不爱国,这方面还是得用谷歌)找到了方法
I have done more looking into this. For more info, if you make sure to remove "MallocNanoZone" property from the NSTask's environment property, then build functions perfectly and generates dsym files!
大概意思就是在 NSTask 的执行环境中将 MallocNanoZone 删除,我的理解是 mac 程序在执行可执行程序的时候使用的是一种与正常的 malloc 不同的微小版 malloc ,造成了 GenerateDSYMFile 在获得 malloc 的时候崩溃。所以我们依法将这个环境变量删除顺利的打包。至此我们打包程序的核心功能就已经完成了,接下来我会慢慢加入更多的功能。或者小伙伴们希望能加入什么功能,我们都可以谈论一下。
未完待续
网友评论