• 【iOS】史上最全的iOS持续集成教程 (上)


    这个系列的博客分为上下两篇,上篇介绍命令行工具使用,下篇介绍利用Jenkins进行持续化集成

    在iOS的开发过程中总是免不了要不停的打包,通常的打包方式是这样的

    XCode->Archive->Export
    

    期间还要选择对应的证书与pp文件,进行一次打包会花不少的时间,在打包的过程中你啥都做不了,只能干等着。今天主要介绍利用命令行来解放你的双手,让你在打包的时候能够释放你的双手。

    今天分享的内容如下:

    1. xcodebuild指令介绍与使用
    2. 利用shell脚本打包
    3. fastlane介绍与使用

    xcodebuild

    xcodebuild 指令是苹果官方提供的命令行打包工具,你可以使用此命令来进行clean、build、test、archive。

    要查看官方的使用指南,可以通过命令 man xcodebuild来查看

    project构建

    要构建xcode项目需要在工程所在目录运行xcodebuild指令,如果目录中含有多个preoject的话,就需要使用-project指令来指定需要构建的工程。默认情况下xcodebuild会以工程里默认的configuration来build工程里的第一个target。

    workspace构建

    要构建workspce,需要设置-workspace与-scheme来定义构建,scheme用于指定要构建的targt以及怎样构建,也可以传递其他参数对scheme进行覆盖。

    我们可以通过以下选项来查看工程中的环境

    • -list 查看当前工程的信息,如:target列表、configuration列表、scheme列表,同时能看到默认的configuration
    • -showBuildSettings 查看构建设置
    • -showdestinations 仅对workspace有效
    • -showsdks 查看SDK列表
    • -usage 使用示例
    • -version 查看当前版本

    xcodebuild 所有指令默认的configuration都是Release

    clean

    #清理构建目录 默认的configurationRelease
    xcodebuild clean
    #也可以指定configuration
    xcodebuild clean -configuration Debug
    

    build

    ### 默认构建
    xcodebuild build
    ### 指定configuration
    xcodebuild build -configuration Debug
    

    test

    test指令需要指定scheme, 同时还需要指定destination。 可以通过-showdestinations指令来获取可用的destination

    xcodebuild -showdestinations -scheme demo_xocdebuild
    
    xcodebuild test -scheme demo_xocdebuild -destination "platform=iOS Simulator,name=iPhone 8"
    
    

    archive

    需要注意的archive时要指定scheme才行

    #projectarchive
    xcodebuild archive -scheme demo_xocdebuild -archivePath test
    

    -exportArchive

    此指令用于导出ipa包,必填参数archivePath、exportPath、exportOptionsPlist

    ### option.plist用于指定打包的method等,此文件可以通过用xcode打包后生成
    xcodebuild -exportArchive  -archivePath test.xcarchive -exportPath test   -exportOptionsPlist 'ExportOptions.plist'
    

    利用shell脚本打包

    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 使用与介绍

    什么是fastlane?

    fastlane是可以自动打包iOS和Android项目的第三方工具,通过简单的配置即可完成打包,还有的功能是实现屏幕截图并上传,上传ipa到testflight,上传ipa到app-store。

    在这里我就只介绍iOS方面的使用了,首先需要安装fastlane。

    安装fastlane

    1. 确定安装了最新的xcode命令行工具
    xcode-select --install
    
    1. 安装fastlane
    [sudo] gem install fastlane -NV
    

    使用fastlane

    和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
    
  • 相关阅读:
    initctl 创建自己的JOB
    TortoiseXX 与TotalCommander (TC)的图标问题
    eclipse 与 tomcat 的那些路径
    把函数视为对象
    序列增量赋值的一个谜题: +=
    __new__ 和 __init__ 的区别
    Python 中 is 与 == 区别
    Flask 2.0.1 changes
    flask run 与 DispatcherMiddleware 不兼容处理
    waitress 部署 flask服务
  • 原文地址:https://www.cnblogs.com/pretty-guy/p/9525548.html
Copyright © 2020-2023  润新知