ios开发--自动打包

命令行工具

自动化构建的命令行工具比持续集成的概念要诞生得早很多,几十年前,Unix世界就已经有了Make,而Java世界有AntMaven,以及当前最流行的Gradle.Net世界则有NantMSBuild。作为以GUI和命令行操作结合的完美性著称的苹果公司来说,当然也不会忘记为自己的封闭的iOS系统提供开发环境下命令行编译工具:xcodebuild

开始xcodebuild之前请首先学习shell脚本语言的基础:Shell学习教程

xcodebuild

1.必要清楚的概念:

Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。使用Workspace的好处有,1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出。Workspace会负责各个Project之间提供各种相互依赖的关系;2),多个项目之间共享Build目录。
Project:指一个项目,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。
Target:一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的所有文件,以及如何构建该产品的配置。
Scheme:一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archive

BuildSetting:配置产品的Build设置,比方说,使用哪个Architectures?使用哪个版本的SDK?。在Xcode Project中,有Project级别的Build Setting,也有Target级别的Build Setting。Build一个产品时一定是针对某个Target的,因此,XCode中总是优先选择Target的Build Setting,如果Target没有配置,则会使用Project的Build Setting。

2.用法介绍:

其用法可以归结为3个部分:

  • 可构建的对象
  • 构建行为
  • 一些其他的辅助命令

可以构建的对象有,默认情况下会运行project下的第一个target:

  • workspace:必须和“-scheme”一起使用,构建该workspace下的一个scheme。
  • project:当根目录下有多个Project的时候,必须使用“-project”指定project,然后会运行
  • target:构建某个Target
  • scheme:和“-workspace”一起使用,指定构建的scheme。
  • ……

构建行为包括:

  • clean:清除build目录下的
  • build: 构建
  • test: 测试某个scheme,必须和"-scheme"一起使用
  • archive:打包,必须和“-scheme”一起使用
  • ……

辅助命令包括:

  • -sdk:指定构建使用的SDK
  • -list:列出当前项目下所有的Target和scheme。
  • -version:版本信息
  • …...

关于xcodebuild更多详细的命令行请参见:点击打开链接

还有更好用的xctool,支持unitTest的。与xcodebuild进行对比可以看构建iOS持续集成平台(一)  

3.开始使用

创建测试项目,并且设置好项目的code signing,provisioning profile(后期还可以通过指令修改)

了解上述概念之后打开“终端”尝试简单的指令:

cd your_projectPath
#build工程到build目录,默认在文件目录下的build文件夹里,如果你的项目是在workspace里
xcodebuild -workspace your_workspaceName.xcworkspace -scheme your_schemeName
#如果你的项目是在project里
xcodebuild -target your_targetName
#在build文件目录下生成.ipa
xcrun -sdk iphoneos PackageApplication -v $(pwd)/build/Release-iphoneos/your_appName.app o build/your_appName.ipa

4.更加多的指令

如果你使用的是workspace可以使用,以下这个脚本,cd 路径 然后执行脚本,就会在桌面生成.ipa

参考源自:XCode自动打ipa包脚本 命令

#工程绝对路径
#cd $1
project_path=$(pwd)
#build文件夹路径
build_path=${project_path}/build

#工程配置文件路径
project_name=$(ls | grep xcodeproj | awk -F.xcodeproj '{print $1}')
project_infoplist_path=${project_path}/${project_name}/${project_name}-Info.plist
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${project_infoplist_path})
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${project_infoplist_path})
#取bundle Identifier前缀
bundlePrefix=$(/usr/libexec/PlistBuddy -c "print CFBundleIdentifier" `find . -name "*-Info.plist"` | awk -F$ '{print $1}')


cd $project_path
echo clean start ...
#删除bulid目录
if  [ -d ${build_path} ];then
rm -rf ${build_path}
echo clean build_path success.
fi
#清理工程
xcodebuild clean || exit
#去掉xcode源码末尾的空格
#find . -name "*.[hm]" | xargs sed -Ee 's/ +$//g' -i ""

#编译工程
xcodebuild  -configuration Release  -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${project_name} \
ONLY_ACTIVE_ARCH=NO \
TARGETED_DEVICE_FAMILY=1 \
DEPLOYMENT_LOCATION=YES CONFIGURATION_BUILD_DIR=${project_path}/build/Release-iphoneos  || exit


if [ -d ./ipa-build ];then
rm -rf ipa-build
fi
#打包
cd $build_path
mkdir -p ipa-build/Payload
cp -r ./Release-iphoneos/*.app ./ipa-build/Payload/
cd ipa-build
zip -r ${project_name}.ipa *

echo ${build_path}/ipa-build/${project_name}.ipa
#找到桌面路径
cd ~/Desktop
#echo Desktop dir
#echo $(pwd)
#拷贝文件
cp -r ${build_path}/ipa-build/${project_name}.ipa  $(pwd)
#清空bulid目录
cd ${build_path}/ipa-build
rm -rf Payload
if  [ -d ${build_path} ];then
rm -rf ${build_path}
fi

如果你使用的是project,把中间的编译工程的xcodebuild 改成-target XX

5.使用java调用,进行最终打包。

http://pan.baidu.com/s/1nt9THBN

6.其它指令总结

//安装brew包管理工具
curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1
//安装xctool
sudo brew update
sudo brew install xctool

xctool -workspace JasonCaoDemoProject.xcworkspace -scheme JasonCaoDemoProject clean
xctool -workspace JasonCaoDemoProject.xcworkspace -scheme JasonCaoDemoProject build

xcodebuild -workspace JasonCaoDemoProject.xcworkspace -scheme JasonCaoDemoProject CODE_SIGN_IDENTITY="iOS Distribution: Guangdong Real-Design Intelligent Technolgoy Co., Ltd."
xcrun -sdk iphoneos PackageApplication -v 源app路径 -o 输出的ipa路径


参考资料:

苹果官网文档--Building from command Line

构建iOS持续集成平台(一)——自动化构建和依赖管理

xcodebuild批量打包心得

can't exec 'codesign' (No such file or directory)

linux 下执行.sh文件总是提示permission denied



你可能感兴趣的:(ios进阶)