Giter Site home page Giter Site logo

blog's People

Contributors

bang88 avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Forkers

benqy

blog's Issues

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

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

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

TOC

安装 fastlane

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

  • 安装 ruby 环境 使用 rbenv
brew install rbenv
  • 完成后加入到环境变量,对应自己的 shell,我这里用了 zsh
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
  • 安装 ruby
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
  • 激活 shell 全局使用的 ruby 版本 rbenv global 2.6.0 关闭 terminal 重新打开就可以正常使用了

  • 安装 fastlane、bundle、cocoapods

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 init

默认情况 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


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

  • IOS 打包需要开发者证书
  • Android 打包需要配置 keystore

配置 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.