這個系列的博客分爲上下兩篇,上篇介紹命令行工具使用,下篇介紹利用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