BANG88 / blog

dev notes
https://domybest.dev
MIT License
1 stars 1 forks source link

在flutter项目中使用fastlane打包apk以及ipa #1

Open BANG88 opened 5 years ago

BANG88 commented 5 years ago

开发过程中经常遇到多个环境切换的问题,手动切换比较麻烦,使用 fastlane 可以快速切换到不同的 env,打包发布的时候可以有时间来上一杯 ☕️,解放这无处安放的 👋

官方有一个例子可以结合使用,但是不喜欢分别在不同的目录初始化一个 fastlane,我喜欢放到一个地方后面方便管理 envs

TOC

安装 fastlane

这里来一个完整版的、之前折腾过很多遍经常会遇到各种各样的问题。

brew install rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
rbenv install 2.6.0
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

output

Checking for `rbenv' in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /usr/local/bin/rbenv-install (ruby-build 20181225)
Counting installed Ruby versions: 1 versions
Checking RubyGems settings: OK
Auditing installed plugins: OK
gem install fastlane -NV

gem install bundler

gem install cocoapods

新项目里面使用 fastlane

flutter create flutter_fastlane_example
➜  flutter_fastlane_example tree -d -L 2
.
├── android
│   ├── app
│   └── gradle
├── ios
│   ├── Flutter
│   ├── Runner
│   ├── Runner.xcodeproj
│   └── Runner.xcworkspace
├── lib
└── test

10 directories

默认情况 fastlane 会去查找 ios 目录,如果没有会提示,此时创建了一个 fastlane 的目录不用理会直接进入到 fastlane 目录再执行一遍fastlane init

fastlane

 现在必须进入到 fastlane 目录才能执行fastlane xxx 有点麻烦,把 fastlane 里面的文件 copy 出来到根目录,这样就可以在根目录执行 fastlane xxx 命令了。现在的目录结构应该是这样

image

传说可以使用bundle exec fastlane 执行速度更快...

image

fastlane 初始化完成了,下面主要关注 Fastfile 以及 --env=dev

多环境小觑

我们这里只准备两个环境一个测试环境、一个生产环境,默认是开发环境,开发环境一般所有配置都是写死项目里面。

我们使用 dotenv 来管理不同环境下的环境变量,在 Fastfile 里面加载文件:

.env 文件相当于一个公共环境所有环境都可以获取到里面的值,有一些公共的属性我们就可以放到这个文件


fastlane_require 'dotenv'

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

before_all do |_lane, _options|
  Dotenv.load(".env.#{ENV['ENV']}.secret")
end

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
    puts (ENV['ENV']).to_s
    puts (ENV['IOS_APP_ID']).to_s
    puts "#{ENV['P12_PASSWORD']}"
  end
end

测试环境

fastlane

每当我们执行 lane 的时候提供不同的 env 参数就可以随意切换到不同的环境里面了。 例如下面的命令表示执行 ios 平台 下面的 custom_lane 并且 env 设置为 dev,这个 env 的参数请跟文件名保持一致,因为目前就是根据这个 env 的值去加载文件

bundle exec fastlane ios custom_lane --env=dev

e6f2779


生产环境

bundle exec fastlane ios custom_lane --env=prod

image

811ef31


现在可以正常切换到不同环境了,接下来就是配置平台打包生成对应的可执行文件,打包之前的注意事项:

配置 Android

# 使用fastlane自带的命令生成apk文件

platform :android do
  desc 'Build android project'
  lane :build do
    sh 'cd ../;flutter clean; flutter build apk --release;cd fastlane;'
    dist = "#{ENV['ANDROID_OUTPUT_PATH']}/#{ENV['ENV']}/"
    sh "mkdir -p #{dist}"
    sh "cp ../#{ENV['ANDROID_APK_PATH']} #{dist}"
  end
end
.env 添加相应的环境变量
### ANDROID PROJECT ###
ANDROID_PROJECT_DIR='android'
ANDROID_APK_PATH='build/app/outputs/apk/release/app-release.apk'
ANDROID_VERSION_CODE='0'
ANDROID_VERSION_NAME='1.0.0'
ANDROID_OUTPUT_PATH='../dist/android'

配置好以后执行 bundle exec fastlane android build --env=dev 将会把 apk 文件复制到 ANDROID_OUTPUT_PATH 目录,这样就算是完成了,看起来是不是很简单,而且如果只是这点操作的话我们可以完全不用 fastlane 随便写几行 shell 就搞定了。但是

但是我们打包的时候需要升级版本号,以及将不同的配置文件或者安全 key、推送通知等等的配置文件都同时修改的话就有点工作量了。所以接下来就是完善配置使其可以根据不同的环境修改我们代码里面的一些配置文件然后再打包,打包完成之后再把这些文件还原回去。

e39b3bb


配置环境

基础配置

set_build_env

每次执行 build 之前先根据 env 设置请求数据的 API 地址、apikey 等基础信息

lane :set_build_env do |_options|
  backup_file(path: 'lib/env.dart')
  environments = %(
/// Api key
const apiKey = '#{ENV['API_KEY']}';

/// Http base url
const baseUrl = '#{ENV['API_BASE_URL']}';
    )
  File.write('../lib/env.dart', environments)
end

lane :restore_build_env do
  restore_file(path: 'lib/env.dart') if File.exist?('../lib/env.dart.back')
end

after_all do |_lane, _options|
  restore_build_env
end

error do |_lane, _exception, _options|
  restore_build_env
end

这里一共包含4laneset_build_envbuild的时候手动调用执行一次,还原配置就通过 after_all 这个全局的配置自动还原了,如果build的过程中出现错误也自动还原配置。

这里的 lib/env.dart 配置文件只是一个例子你可以使用你自己喜欢的命名,然后对应修改Fastfile里面的路径就可以了。

34fa122


To be continued

CMingTseng commented 5 years ago

請問一下

我遇到一個怪問題

在Android部分

我的整個結構是

. ├── MyApplication ├── app ├── fastlane ├── mykey.jks │ └── mykey.jks └── gradle

我的fastlane內的Appfile定義了

ENV["KEYSTORE_PATH"]="keystore/mykey.jks"

但是目前執行出現問題

上面的配置會無法通過 !!!

fastlane 會抓兩個地方的 keystore !!!

有嘗試過

../keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/../keystore/mykey.jks } !!?

以及

\keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/app/keystore/mykey.jks } !!?

以及

\/keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/keystore/mykey.jks } !!?

以及

app/keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/app/app/keystore/mykey.jks } !!?

需要在app內在放置一個keystore (同時兩個 keystore !!)

這樣才可以通過build

請問有遇過嗎?

THX

BANG88 commented 5 years ago

不好意思 沒遇到過,不過之前我也是把keystore文件放到android目錄裡面,我現在不在電腦前 沒辦法幫你看 你可以試試

On Fri, Oct 25, 2019 at 11:23 Neo notifications@github.com wrote:

請問一下

我遇到一個怪問題

在Android部分

我的整個結構是

. ├── MyApplication ├── app ├── fastlane ├── mykey.jks │ └── mykey.jks └── gradle

我的fastlane內的Appfile定義了

ENV["KEYSTORE_PATH"]="keystore/mykey.jks"

但是目前執行出現問題

上面的配置會無法通過 !!!

fastlane 會抓兩個地方的 keystore !!!

有嘗試過

../keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/../keystore/mykey.jks } !!?

以及

\keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/app/keystore/mykey.jks } !!?

以及

/keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/keystore/mykey.jks } !!?

以及

app/keystore/mykey.jks <-- show error path { /users/me/workspace/myapplicatin/app/app/keystore/mykey.jks } !!?

需要在app內在放置一個keystore (同時兩個 keystore !!)

這樣才可以通過build

請問有遇過嗎?

THX

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/bang88/blog/issues/1?email_source=notifications&email_token=AADJY2Z6UI46YLAU2OHR5NLQQJREDA5CNFSM4GS6IMT2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOECHB44I#issuecomment-546184817, or unsubscribe https://github.com/notifications/unsubscribe-auth/AADJY246XPSNKADDHQZ5WQTQQJREDANCNFSM4GS6IMTQ .