使用fastlane自动化构建iOS应用

前篇文章介绍Android多环境编译打包。

本篇介绍如何使用fastlane构建多版本应用。

安装

工具的起源本身是专门针对 iOS 项目,因此目前依赖于 macOS 10.9 以上系统,Ruby 是一个众所周知的轮子发明者,很多知名的工具都是它开发的,fastlane 也不例外。以下是依赖环境:

  • macOS 10.9+
  • Ruby 2.0+ (推荐 rvm 或 rbenv 安装)
  • Xcode + command line tools

安装最新的Xcode命令行工具

xcode-select --install

安装fastlane

# Using RubyGems
sudo gem install fastlane -NV

# Alternatively using Homebrew
brew cask install fastlane

使用

切换到你的iOS工程目录,在目录下执行:

fastlane init

初始化过程会有选项提示,根据自己的情况选择即可,我一般选择“Manual setup”。

完成后会看到目录下多了一个Gemfile,还有一个fastlane文件夹,里面包含两个文件:AppFile和Fastfile。

  • Fastfile: 核心文件,主要用于 cli 调用和处理具体的流程
  • Appfile: 从 Apple Developer Portal 获取和项目相关的信息

先将注意力集中在Fastfile中。新创建的文件内容如下:

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

我们需要编写的内容都在platform :ios do到末行end之间。

  • lane:定义一个名为custom_lane的任务方法。任务可以定义多个并互相调用,支持参数。
  • desc:任务描述

我们的目标是构建应用,先来创建一个最简单的任务:

platform :ios do
  desc "构建beta版本"
  lane :beta do
    # add actions here: https://docs.fastlane.tools/actions
  build_app(scheme: "myapp",
            workspace: "myapp.xcworkspace",
            export_method: "development",
            include_bitcode: true)
  end
end

执行命令:fastlane beta
编译结束后,你就会在根目录看到已经编译好的ipa文件:MyApp.ipa

build_app是一个action,是build_ios_app的别名,常用的参数配置如下:

  • workspace:xcworkspace工程文件路径
  • project:xcodeproj工程文件路径,如果是workspace工程不需要填这个
  • scheme:指定scheme
  • clean:编译前是否清理
  • output_directory:ipa文件保存路径
  • output_name:自定义ipa文件名
  • export_method:支持app-store, ad-hoc, package, enterprise, development, developer-id
  • include_bitcode:是否开启include_bitcode选项

更详细的参数列表请看文档:https://docs.fastlane.tools/actions/build_app/#parameters

除了build_app之外,falstlane还支持非常多的action,更多action查看文档https://docs.fastlane.tools/actions

下面列举几种:

  • increment_version_number:自动更新版本号
  • update_app_identifier:更新bundleID
  • update_info_plist:更新info.plist,不过只能更新bundle id和Display Name。不要用此方法更新bundle id,而是建议用update_app_identifier更新。
  • update_plist:更新plist文件中,可以修改plist中的键值对。

多版本构建

我希望通过fastlane在本地快速构建开发、生产环境不同版本的App,需求点依然是每个版本的bundle id、接口地址、应用名称、sdk secret key不一样,最终只通过命令完成一键构建。

我们先定一个任务(lane),用来修改配置

  desc "修改项目配置"
  desc "参数 prod 判断是否为生产版本"
  lane :set_app_mode do |options|
    prod = options[:prod] || false
    # bundle id
    app_id_suffix = prod ? "prod" : "dev"
    # 应用名称
    app_name_suffix = prod ? "" : "测试版"

    # app center应用统计sdk的secret key,分环境
    app_center_dev_secret = "aaaaaa"
    app_center_prod_secret = "bbbbbb"
    app_center_secret = prod ? app_center_prod_secret : app_center_dev_secret

    # 接口地址
    backend_dev = "https://dev.example.com"
    backend_prod = "https://prod.example.com"
    backend = prod ? backend_prod : backend_dev

    # 更新bundle id
    update_app_identifier(
      xcodeproj: "myapp.xcodeproj",
      plist_path: "myapp/Info.plist",
      app_identifier: "com.example.myapp.#{app_id_suffix}"
    )
    # 更新应用名称字段display_name
    update_info_plist(
      xcodeproj: "myapp.xcodeproj",
      plist_path: "myapp/Info.plist",
      display_name: "MyApp#{app_name_suffix}"
    )
    update_plist(
      plist_path: "myapp/Config.plist",
      block: proc do |plist|
        plist[:appSecret] = app_center_secret
        plist[:backend] = backend
      end
    )
  end

有了这个方法,我们可以轻松得通过fastlane命令来切换环境配置

# 切换到生产环境
fastlane set_app_mode prod:true

接着我们编写一个编译任务

  desc "编译任务"
  lane :build do |options|
    prod = options[:prod] || false
    suffix = prod ? "prod" : "dev"
    set_app_mode(prod: prod)
    build_app(
      scheme: "myapp",
      workspace: "myapp.xcworkspace",
      include_bitcode: true,
      export_method: prod ? "ad-hoc" : "development",
      output_directory: "./build",
      output_name: "myapp_#{suffix}.ipa"
    )
    # 重置回开发版配置。日常开发使用的就是开发版配置,这里只是置到日常状态
    set_app_mode(prod: false)
  end

  desc "编译beta版本"
  lane :beta do
    build(prod: false)
  end

  desc "编译release版本"
  lane :release do
    build(prod: true)
  end

这里就实现了轻松编译两个版本的命令

#编译生产环境ipa,保存路径 ./build/myapp_prod.ipa
fastlane release
#编译开发环境ipa,保存路径 ./build/myapp_dev.ipa
fastlane beta

实现分发

fastlane还有个很好用的插件机制,官方还提供了个可用的插件列表https://docs.fastlane.tools/plugins/available-plugins/

我app分发用的fir.im,当然也可以使用蒲公英。他们在fastlane中都有对应的插件:fir
和 pgyer

首先引入插件,执行

fastlane add_plugin fir

如果你之前没有装过插件,它会在fastlane文件夹中创建一个Pluginfile文件,内容如下:

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

gem 'fastlane-plugin-firim'

好了,这样插件就装好了,接着是使用,直接定义两个任务

  desc "编译beta版本并上传至fir.im"
  lane :beta_fir do
    beta
    firim(firim_api_token: ENV["FIR_TOKEN"])
  end

  desc "编译release版本并上传至fir.im"
  lane :release_fir do
    release
    firim(firim_api_token: ENV["FIR_TOKEN"])
  end

这样就非常方便的打包和发布不同版本的安装包了。

# 编译beta版本并上传至fir.im
fastlane beta_fir
# 编译release版本并上传至fir.im
fastlane release_fir

推荐写的非常详细的关于fastlane的博客:
Fastlane - iOS 和 Android 的自动化构建工具
深入浅出 Fastlane 一看你就懂

你可能感兴趣的:(使用fastlane自动化构建iOS应用)