【IOS】IOS工程自动打包并发布脚本实现

网上看到一个build ios工程并打包的脚本,写的很不错,学习了下,并添加部分注释,方便理解

执行:

1. 若当前工程目录为Helloworld,进入上一级目录

2. 在终端输入:./ipa-build Helloworld

3. 编译完成,会在Helloworld下面产生一个build的目录。

*******************************************************************************************************************************************

#!/bin/bash#——————————————–# 功能:编译xcode项目并打ipa包# 使用说明:#编译project#ipa-build <project directory> [-c <project configuration>] [-o <ipa output directory>] [-t <target name>] [-n]#编译workspace#ipa-build <workspace directory> -w -s <schemeName> [-c <project configuration>] [-n]## 参数说明:-c NAME工程的configuration,默认为Release。#-o PATH生成的ipa文件输出的文件夹(必须为已存在的文件路径)默认为工程根路径下的”build/ipa-build“文件夹中#-t NAME需要编译的target的名称#-w编译workspace#-s NAME对应workspace下需要编译的scheme#-n编译前是否先clean工程# 作者:ccf# E-mail:ccf.developer@gmail.com# 创建日期:2012/09/24#——————————————–# 修改日期:2013/02/18# 修改人:ccf# 修改内容:打包方式改为使用xcrun命令,并修改第二个参数#——————————————–# 修改日期:2013/04/25# 修改人:ccf# 修改内容:采用getopts来处理命令参数,并增加编译前清除选项#——————————————–# 修改日期:2013/04/26# 修改人:ccf# 修改内容:增加编译workspace的功能#——————————————–# $#是获取当前脚本参数 -lt是小于的意思,即如果参数个数小于1if [ $# -lt 1 ];thenecho "Error! Should enter the root directory of xcode project after the ipa-build command."exit 2fi#-d是目录文件 $1是第一个参数,即第一个参数对应的字符串是一个目录文件if [ ! -d $1 ];thenecho "Error! The first param must be a directory."exit 2fi#工程绝对路径cd $1project_path=$(pwd)#编译的configuration,默认为Releasebuild_config=Releaseparam_pattern=":nc:o:t:ws:"OPTIND=2# 若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同param_pattern相比较。若有匹配,则把变量optname值设为该选项。若无匹配,,则optname为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。# 在使用getopts命令的时候,shell会自动产生两个变量OPTIND和OPTARG。# OPTIND初始值为1,其含义是下一个待处理的参数的索引。只要存在,getopts命令返回true,所以一般getopts命令使用while循环;# OPTARG是当getopts获取到其期望的参数后存入的位置。而如果不在其期望内,则$optname被设为?并将该意外值存入OPTARG; 如果$optname需要拥有具体设置值而实际却没有,则$optname被设为:并将丢失设置值的optname存入OPTARG;# 对于$optname,可以用后标:来表示是否需要值;而前标:则表示是否开启静默模式。while getopts $param_pattern optname do case "$optname" in"n") should_clean=y ;; "c") tmp_optind=$OPTINDtmp_optname=$optnametmp_optarg=$OPTARGOPTIND=$OPTIND-1if getopts $param_pattern optname ;thenecho "Error argument value for option $tmp_optname"exit 2fiOPTIND=$tmp_optindbuild_config=$tmp_optarg ;; "o")tmp_optind=$OPTINDtmp_optname=$optnametmp_optarg=$OPTARGOPTIND=$OPTIND-1if getopts $param_pattern optname ;thenecho "Error argument value for option $tmp_optname"exit 2fiOPTIND=$tmp_optindcd $tmp_optargoutput_path=$(pwd)#获取输出的当前路径if [ ! -d $output_path ];thenecho "Error!The value of option o must be an exist directory."exit 2fi ;;"w")workspace_name=’*.xcworkspace’ls $project_path/$workspace_name &>/dev/null #/dev/null 表示空设备,把输出信息导入到空的设备,即不显示输出信息#$?是判断最近一句是否成功,即上一句语句是否执行成功?rtnValue=$?#basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任何指定的 Suffix 参数,并将剩余的基本文件名称写至标准输出 if [ $rtnValue = 0 ];thenbuild_workspace=$(echo $(basename $project_path/$workspace_name))elseecho "Error!Current path is not a xcode workspace.Please check, or do not use -w option."exit 2fi ;;"s")tmp_optind=$OPTINDtmp_optname=$optnametmp_optarg=$OPTARGOPTIND=$OPTIND-1if getopts $param_pattern optname ;thenecho "Error argument value for option $tmp_optname"exit 2fiOPTIND=$tmp_optindbuild_scheme=$tmp_optarg ;; #通过这段逻辑处理,可以获取-s后跟着的参数,即将OPTARG的值取出来"t")tmp_optind=$OPTINDtmp_optname=$optnametmp_optarg=$OPTARGOPTIND=$OPTIND-1if getopts $param_pattern optname ;thenecho "Error argument value for option $tmp_optname"exit 2fiOPTIND=$tmp_optindbuild_target=$tmp_optarg ;; "?") echo "Error! Unknown option $OPTARG"exit 2 ;; ":") echo "Error! No argument value for option $OPTARG"exit 2 ;; *) # Should not occur echo "Error! Unknown error while processing options"exit 2 ;; esac done#build文件夹路径build_path=${project_path}/build#生成的app文件目录appdirname=Release-iphoneosif [ $build_config = Debug ];thenappdirname=Debug-iphoneosfi#编译后文件路径(仅当编译workspace时才会用到)compiled_path=${build_path}/${appdirname}#是否cleanif [ "$build_config" = "y" ];thenxcodebuild cleanfi#组合编译命令build_cmd=’xcodebuild’if [ "$build_workspace" != "" ];then#编译workspaceif [ "$build_scheme" = "" ];thenecho "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."exit 2fibuild_cmd=${build_cmd}’ -workspace ‘${build_workspace}’ -scheme ‘${build_scheme}’ -configuration ‘${build_config}’ CONFIGURATION_BUILD_DIR=’${compiled_path}’ ONLY_ACTIVE_ARCH=NO’else#编译projectbuild_cmd=${build_cmd}’ -configuration ‘${build_config}if [ "$build_target" != "" ];thenbuild_cmd=${build_cmd}’ -target ‘${build_target}fifi#编译工程cd $project_path$build_cmd || exit#进入build路径cd $build_path#创建ipa-build文件夹if [ -d ./ipa-build ];thenrm -rf ipa-buildfimkdir ipa-build#app文件名称appname=$(basename ./${appdirname}/*.app)#通过app文件名获得工程target名字target_name=$(echo $appname | awk -F. ‘{print $1}’)#app文件中Info.plist文件路径app_infoplist_path=${build_path}/${appdirname}/${appname}/Info.plist#取版本号bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${app_infoplist_path})#取build值bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${app_infoplist_path})#IPA名称ipa_name="${target_name}_${bundleShortVersion}_${build_config}${bundleVersion}_$(date +"%Y%m%d")"echo $ipa_name#xcrun打包xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exitif [ "$output_path" != "" ];thencp ${build_path}/ipa-build/${ipa_name}.ipa $output_path/${ipa_name}.ipaecho "Copy ipa file successfully to the path $output_path/${ipa_name}.ipa"fi

心有多大,舞台就有多大。

【IOS】IOS工程自动打包并发布脚本实现

相关文章:

你感兴趣的文章:

标签云: