这个系列的博客分为上下两篇,上篇介绍命令行工具使用,下篇介绍利用Jenkins进行持续化集成html
在iOS的开发过程当中老是免不了要不停的打包,一般的打包方式是这样的node
XCode->Archive->Export
期间还要选择对应的证书与pp文件,进行一次打包会花很多的时间,在打包的过程当中你啥都作不了,只能干等着。今天主要介绍利用命令行来解放你的双手,让你在打包的时候可以释放你的双手。ios
今天分享的内容以下:web
xcodebuild 指令是苹果官方提供的命令行打包工具,你可使用此命令来进行clean、build、test、archive。shell
要查看官方的使用指南,能够经过命令 man xcodebuild来查看xcode
要构建xcode项目须要在工程所在目录运行xcodebuild指令,若是目录中含有多个preoject的话,就须要使用-project指令来指定须要构建的工程。默认状况下xcodebuild会以工程里默认的configuration来build工程里的第一个target。markdown
要构建workspce,须要设置-workspace与-scheme来定义构建,scheme用于指定要构建的targt以及怎样构建,也能够传递其余参数对scheme进行覆盖。app
咱们能够经过如下选项来查看工程中的环境ssh
xcodebuild 全部指令默认的configuration都是Releaseiphone
#清理构建目录 默认的configuration为Release
xcodebuild clean
#也能够指定configuration
xcodebuild clean -configuration Debug
### 默认构建 xcodebuild build ### 指定configuration xcodebuild build -configuration Debug
test指令须要指定scheme, 同时还须要指定destination。 能够经过-showdestinations指令来获取可用的destination
xcodebuild -showdestinations -scheme demo_xocdebuild
xcodebuild test -scheme demo_xocdebuild -destination "platform=iOS Simulator,name=iPhone 8"
须要注意的archive时要指定scheme才行
#project的archive
xcodebuild archive -scheme demo_xocdebuild -archivePath test
此指令用于导出ipa包,必填参数archivePath、exportPath、exportOptionsPlist
### option.plist用于指定打包的method等,此文件能够经过用xcode打包后生成 xcodebuild -exportArchive -archivePath test.xcarchive -exportPath test -exportOptionsPlist 'ExportOptions.plist'
shell脚本示例以下:
#!/bin/sh
### 配置定义
PROJECT_NAME="test"
# 获取当前脚本路径
# basepath=$(cd `dirname $0`; pwd)
CONFIGURATION="Debug"
#工程名
WORKSPACE="demo.xcworkspace"
#设置打包路径
PACKAGE_PATH="Package"
#archive path
XCARCHIVE_PATH="${PACKAGE_PATH}/xcarchive/${PROJECT_NAME}.xcarchive"
#ipa 路径
IPA_Path="${PACKAGE_PATH}/ipa"
#ipa名称
IPAFILE_NAME="${PROJECT_NAME}.ipa"
#导出ipa路径
EXPORT_PATH="${IPA_Path}/${IPAFILE_NAME}"
optionPlistName="ExportOptions_development"
# clean
echo "xcodebuild clean"
xcodebuild clean -workspace ${WORKSPACE} \
-scheme ${PROJECT_NAME} \
-configuration ${CONFIGURATION} \
| xcpretty
# archive
echo "xcodebuild archive"
xcodebuild archive -workspace ${WORKSPACE} \
-scheme ${PROJECT_NAME} \
-configuration ${CONFIGURATION} \
-destination generic/platform=iOS \
-archivePath ${XCARCHIVE_PATH} \
| xcpretty
# test
xcodebuild test -workspace ${WORKSPACE} \
-scheme ${PROJECT_NAME} \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 8' \
| xcpretty
# export ipa
echo "xcodebuild exportArchive"
xcodebuild -exportArchive -archivePath ${XCARCHIVE_PATH} \
-exportPath ${EXPORT_PATH} \
-exportOptionsPlist ${optionPlistName}.plist \
-verbose \
| xcpretty
使用方式,将此脚本放到项目路径下,而后执行便可
sh debug.sh
fastlane是能够自动打包iOS和Android项目的第三方工具,经过简单的配置便可完成打包,还有的功能是实现屏幕截图并上传,上传ipa到testflight,上传ipa到app-store。
在这里我就只介绍iOS方面的使用了,首先须要安装fastlane。
xcode-select --install
[sudo] gem install fastlane -NV
和xcodebuild的使用方式同样,fastlane也须要在项目全部路径使用。首先咱们在命令行进入到项目路径,而后初始化fastlane。如下介绍都是基于使用XCode自动建立了证书的状况下来使用,由于这样fastlane自动生成的pp文件才能匹配,不然就须要在gym中显示的指定pp文件。
fastlane init -verbose
初始化后,就能够变成fastlane命令了 示例以下
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :test do
scan(
# workspace: "FinupCredit.xcworkspace",
# scheme: "test",
devices: ["iPhone 8 Plus"],
)
end
lane :beta do |values|
scan(
# workspace: "FinupCredit.xcworkspace",
devices: ["iPhone 8 Plus"],
)
v = values[:i]
time = Time.new.strftime("%Y%m%d")
version = get_version_number
ipaName = "debug_#{version}_#{time}_V_#{v}.ipa"
gym(
clean: true,
configuration: "Debug",
export_method: "development",
output_directory: "./Debug",
output_name: "#{ipaName}",
)
end
lane :release do |values|
scan(
# workspace: "FinupCredit.xcworkspace",
devices: ["iPhone 8 Plus"],
)
v = values[:i]
time = Time.new.strftime("%Y%m%d")
version = get_version_number
ipaName = "release_#{version}_#{time}_V_#{v}.ipa"
gym(
clean: true,
configuration: "Release",
export_method: "app-store",
output_directory: "./Release",
output_name: "#{ipaName}",
)
end
end
在这里scan和gym分别是fastlane提供的两个action,scan的做用是执行项目中的单元测试,gym则是用来打包的。在这个脚本中咱们容许传入变量,用来生成ipa名称。
gym中的。。。也能够指定plist文件,使用方式以下
desc "使用opetionPlist来指定打包配置"
lane :useOptionPlist do |values|
scan(
# workspace: "FinupCredit.xcworkspace",
devices: ["iPhone 8 Plus"],
)
v = values[:i]
time = Time.new.strftime("%Y%m%d")
version = get_version_number
ipaName = "debug_#{version}_#{time}_V_#{v}.ipa"
gym(
clean: true,
configuration: "Release",
export_method: "development",
output_directory: "./Release",
output_name: "#{ipaName}",
#指定plist路径
export_options: "./ExportOptions_app_store.plist"
)
end