1. 使用fastlane打包

1.1. fastlane理解

之前写了一篇使用shell打包的文章,从这篇文章打包是可以通过编写shell脚本完成,那么为什么还需要fastlane呢?

  1. fastlane可以通过一个简单的通过简单命令来完成诸如截图、获取证书、编译、导出安装包,而不需要去关心如何去写大量的打包脚本。
  2. fastlane可以定义多个任务,例如:打包到不同渠道包时,我们可以定义多个任务,只需要一行简单命令。
  3. fastlane打包直接就包含了dsym等文件,而使用脚本还得自己去实现。

1.2. fastlane安装及配置

fastlane安装

sudo gem install fastlane -n /usr/local/bin

fastlane升级

bundle update fastlane

fastlane配置

cd 项目目录
fastlane init

执行以上命令,项目目录下会生成相应的Appfile、Fastfile。

执行fastlane init,bundle update卡住了

1.3. Appfile

Appfile是用来配置一些类似于AppleID、BundleID参数(参数是fastlane已经定义好的,新增的并没有用,如果想新增变量需要使用.env方式),可以在Fastfile中使用,AppleID、BundleID等其实会被一些actions直接调用,并不需要写出来传递。

1.3.1. 普通配置方式

直接在Appfile里填写app_identifier、apple_id、team_id等,然后根据lane的不同可以设置成不同。

# 默认配置
app_identifier    "com.devhy.test"
apple_id    "devhy1@xxxx.com"
team_id    "xxxxxxxxx1"

# 如果lane是ent换成Dev的配置
for_lane :ent do
  app_identifier    "com.devhy.testDev"
  apple_id    "devhy2@xxxx.com"
  team_id    "xxxxxxxxx2"
end

1.3.2. 使用.env配置方式

.env这个文件的作用是作为环境变量的配置文件,在fastlane init进行初始化后并不会自动生成,如果需要可以自己创建。

执行时默认会读取.env.env.default文件里的配置。通过执行fastlane [lane-name] --env [envName]来指定使用配置文件.env.[envName],读取顺序是.env -> .env.default -> .env.,相同的变量名会被后面的覆盖。

如我建了文件.env.myDev,里面写了一些参数,那在执行的时候使用fastlane [lane-name] --env myDev即可,想在AppfileDeliverfileFastfile等调用,直接使用ENV['keyName']即可。

# .env.myDev文件
# bundle id
App_Identifier = "com.devhy.testDev"
# 开发者账号
Apple_Id = "xx2@xxxx.com"
# 开发者TeamId
Team_Id  = "xxxxxxxxx2"
# project的target scheme名称
Scheme   = "HYTestDev"
# Appfile使用.env方式直接读取变量即可
app_identifier     ENV['App_Identifier']
apple_id          ENV['Apple_Id']
team_id             ENV['Team_Id']

注意:因为是.env文件是.开头文件,默认是在finder中隐藏的,需要通过执行一下命令来显示:

# 设置隐藏文件可见
defaults write com.apple.finder AppleShowAllFiles TRUE
# 重启finder服务以生效
killall Finder

1.3.3. 配置方式对比

普通配置方式:简单易懂,但不能自定义变量,且每个lane想不一样都要写一个for_lane .env配置方式:功能性强,但配置起来稍微麻烦一点。

1.4. Deliverfile

Deliverfile是用来配置上传到iTunesConnect所需信息的,由于我们主要用fastlane来打包,发布是手动将ipa包提交审核,由于没有进行过尝试所以该文件配置方式就不叙述了。

1.5. Fastfile

Fastfile是对流程进行控制的核心文件,需要设定支持的平台和在一些环节里需要做的事情。

1.5.1. 基本结构

Fastfile主要是根据设定的平台,可以在before_all、after_all、error中做一些操作以及建立一些lane作为关键的执行逻辑,可以在其中使用fastlane内置的action,也可以调用自建action,还可以调用别的lane。

# 因为fastlane存在新老版本兼容问题,所以一般会指定fastlane版本
fastlane_version "2.62.0"
default_platform :ios

platform :ios do
  # 所有lane执行之前,可以做如执行cocoapods的pod install
  before_all do
    cocoapods
  end

  # 名字叫ent的lane,命令行里执行fastlane ent
  lane :ent do
    # 执行一些action,如cert下载证书,sigh下载pp文件,gym进行编译和导出包
  end

  # 执行fastlane store即可
  lane :store do
    # 调用一些action

    # 调用别的lane,比如send_msg
    send_msg
  end

  lane :send_msg do
    # 调用一些action
  end

  # 所有lane完成之后,可以适用参数lane来区分
  after_all do |lane|
  end

  # 所有lane失败之后,可以适用参数lane来区分
  error do |lane, exception|
  end
end

1.5.2. Fastfile样例

下面的Fastfile样例是配置了.env+Appfile后进行编写,因为这样在配置action时,可以省去一些入参。 因为使用了Appfile,cert的username、team_id 以及 sigh的app_identifier、username、team_id 可以不用传入了,fastlane在执行时会自己去从Appfile里取。以及之前在.env环境配置中设定了一个Scheme的字段,那么gym的scheme我们可以使用ENV['Scheme']来调用。

fastlane_version "2.62.0"
default_platform :ios

platform :ios do

  before_all do
    cocoapods
  end

  lane :store do
    # action(cert),下载[开发者证书.cer]
    # 下载的文件会存在项目根目录的build文件夹下
    # fastlane会让你在命令行登录开发者账号,登录成功后,会在你的[钥匙串]中创建一个 {deliver.[username]} 的登录账户
    cert(
      # Appfile设置了这边就可以不用了
      # username: "devhy2@xxxx.com",
      # team_id: "xxxxxxxxx2",

      # 下载.cer文件的位置
      output_path: "build",
    )

    # action(sigh),下载[安装app匹配的Provision Profile文件(pp文件)]
    # 建议自己去苹果开发者网站证书中手动处理一波provision_profile
    # 建议用 bundleId_导出方式 来命名比如: 
    #     企业包pp文件叫 testDev_InHouse.mobileprovision
    sigh(
      # Appfile设置了这边就可以不用了
      # app_identifier: "com.devhy.testDev",
      # username: "devhy2@xxxx.com",
      # team_id: "xxxxxxxxx2",

      # 下载pp文件的位置
      output_path: "build",
      # 自动下载签名时,adc里pp名字,不写也可以会根据你的bundle id、adhoc与否去下载最新的一个
      # provisioning_name: "testDev_InHouse", 
      # 仅下载不创建,默认是false
      readonly: true, 
      # 因为是根据BundleID下载,导致adhoc和appstore会优先appstore,导致最后导出报错,如果是adhoc包请设置为true
      adhoc: true, 
    )

    # 编译配置,编译的scheme,导出包方式
    gym(
      # 使用.env配置的环境变量
      scheme: ENV['Scheme'],
      # app-store, ad-hoc, package, enterprise, development, developer-id
      export_method: "enterprise", 
      # 输出日志的目录
      buildlog_path: "fastlanelog",
      # 输出编译结果
      output_directory: "build",
      include_bitcode: false
    )
  end

  after_all do |lane|
  end

  error do |lane, exception|
  end
end

1.5.3. actions

在fastlane中使用的诸如cer()、sigh()、gym()都是action,其本质是预先写好的ruby脚本(如:sigh.rb),fastlane中有很多已经写好的actions,当然也可以自己进行编写。

命令行常用的操作有:

1. 查看所有Action fastlane actions
2. 查看某个Action的参数说明 fastlane action [action_name]如(fastlane action gym)

1.5.4. 版本自增及指定

# 版本处理
def setup_version_build(options)
  if "#{options[:build]}".empty?
    increment_build_number(
      xcodeproj: ENV['Xcodeproj']
    )
  else
    increment_build_number(
      xcodeproj: ENV['Xcodeproj'],
      build_number:options[:build]
    )
  end

  unless "#{options[:version]}".empty?
    increment_version_number(
      xcodeproj: ENV['Xcodeproj'],
      version_number:options[:version]
    )
  end
end

1.5.5. 使用fastlane上传App到蒲公英

https://www.pgyer.com/doc/view/fastlane

1.5.6. 使用fastlane上传App到蒲公英

fastlane-plugin-firim

1.5.7. Fastlane && AppStore Connect API

Fastlane && AppStore Connect API

1.5.8. 配置后的使用

编写完各种配置后怎么使用?其实使用方法还是比较简单的,不使用.env配置,执行fastlane [lane_name]即可。

使用某个.env配置,执行fastlane [lane_name] --env [env_name]即可 ,比如我在需要执行样例的Fastfile的store,并使用.env.myDev配置,那我可以执行fastlane store --env myDev。

1.6. 完整脚本

Fastfile

1.7. 参考链接

results matching ""

    No results matching ""