正文

经过一段时间的学习和项目实践,你会发现,

打包->上传蒲公英->生成二维码

是一个枯燥且乏味的事情,只要打包配置项,配置完成,剩下的基本上就是无聊的等待,和机械的步骤.

之前在写iOS项目的时候,一直都是使用fastlane,和xcodebuild,进行脚本打包的.

只是那个时候,只是会简单的打包,并没有深究上传.

最近花时间把flutter自动化打包也给加上了.

脚本运行视频

打包流程图

在开始编写打包工具前,我们需要先把打包流程自己画一画,可以让我们在脑子里,先过一下整体流程,哪些需要准备,哪些需要单独处理.这里我把我从第一次写流程图,到最终流程图确定的过程也分享给大家.也算是一种记录吧.

第一版

第二版

第三版

相对来说,经过这三版的改进,也算是把整体流程捋顺了,从一开始不能自定义参数,到可以自定义参数,从只会打包出apk和ipa.到可以上传到蒲公英,上传到iOS商店.也算是基本完成了我的需求,所以下一步,就是按照我们画的流程图,进行代码的编

脚本目录讲解

├── shell_pack
│   ├── ExportOptions.plist(导出iOS商店包需要的plist)
│   ├── ExportOptions_dev.plist(导出iOS测试包)
│   ├── ExportOptions_hoc.plist(导出hoc包)
│   ├── pack.sh(入口)
│   ├── pack_apk.sh(apk打包模块)
│   ├── pack_clear_create_tool.sh(清缓存和构建文件模块)
│   ├── pack_config.sh(全局配置项)
│   ├── pack_ipa.sh(ipa打包模块)
│   ├── pack_tool.sh(工具模块)
│   └── pgyer_upload.sh(蒲公英模块)

这就是根据我们画的流程图,我这边设计的代码实现分布,之前也看过其他人写的shell脚本,一般都是把所有的代码写到一块,可能我这边一看到这么多代码,就会有抗拒心里,所以,根据我的开发习惯,我会把主流程放在入口模块,具体的业务实现,会下发到各个功能模块里,这样的话也方便各个模块的独自联调测试.👇,我来简单介绍一下对应模块的功能.

pack.sh(入口)

# shellcheck disable=SC1091
# shellcheck disable=SC2154
source ./pack_tool.sh
source ./pack_ipa.sh
source ./pack_apk.sh
source ./pack_config.sh
source ./pack_clear_create_tool.sh
# 为了可以执行 sh 文件所有的函数
chmod a x pack_clear_create_tool.sh pack_tool.sh
echomsg "STAR"
echomsg "开始配置参数"
param_count=$#
if [ $param_count == 0 ]; then
    normalTip
else
    for i in "$@"; do
        if [[ $i == "-h" ]]; then
            echoHelp
            exit
        else
            funWithParam "$i"
        fi
    done
fi
configbuildType
echomsg "参数配置完成"
# 最终打包配置结果显示
echoTip
# 清楚缓存
cleanFun
# 构建文件
createLib
# 打包上传
if [ "$pack_os" == 0 ]; then
    buidApk
    buidIos
elif [ "$pack_os" == 1 ]; then
    buidApk
else
    buidIos
fi
echomsg "END"

从代码中,我把入口模块划分成4个小模块

1. 配置参数

2. 清理缓存

3. 构建文件

4. 打包上传

这也符合我们梳理的流程图.这里我打算把具体的代码实现分为三部分进行讲解.

第一部分

  • 参数配置
  • 清理缓存
  • 构建版本

第二部分

  • 安卓项目配置项
  • 安卓打包
  • 上传蒲公英

第三部分

  • iOS项目配置项
  • iOS打包
  • 上传蒲公英
  • 上传商店

👆分类,我会在以后的文章里进行详细讲解.👇我继续讲解一下

  • pack_config.sh(全局配置项)
  • 脚本使用

pack_config.sh(全局配置项)

# ======================== 命令参数 ======================== #
# 打包系统 0 全部 1 apk 2 ipa
pack_os=0
# 上传类型 1 商店 2 蒲公英
upload_type=1
# 打包环境 1 Releas 2 Deubg
project_build_type=1
# 编译环境
build_type="release"
# 是否清理缓存 1 清理 0不清理
project_is_clear=1
# 0 全部市场 具体 123 是你自己修改apk_channels 对应的渠道
pack_apk_channel=0
# ======================== 工程配置项 ======================== #
# 工程相对路径
project_path=$(dirname $(pwd))
# ======================== Android ======================== #
# Flutter android release 打包生成的路径
flutter_release_apk_path=$project_path/build/app/outputs/apk/release/
# Flutter android debug 打包生成的路径
flutter_debug_apk_path=$project_path/build/app/outputs/apk/debug/
# 安卓打包根文件
export_android_path=$project_path/export/apk
# apk 最终Release存放的地方
export_apk_release_path=$export_android_path/release/
# apk 最终Debug存放的地方
export_apk_debug_path=$export_android_path/debug/
# 安卓渠道HUAWEI VIVO YYB
apk_channels=(HUAWEI)
# 安卓渠道 个数
apk_chanhels_length=0
# ======================== IOS ======================== #
# 工程名字
project_name=Runner
# scheme 名字
project_scheme=$project_name
# xcworkspace路径
project_workspace_path=$project_path/ios/$project_name.xcworkspace
# xcarchive 名字
xcarchive_name=${project_name}.xcarchive
# ipa 名字
ipa_name=$project_name
# ios 团队ID
ios_teamID=""
# 商店账号
xcrun_u=""
# 账号专属密码
xcrun_p=""
# 导出iOS文件路径
export_ios_path=$project_path/export/ios
# 导出 xcarchive路径
export_xcarchive_path=$export_ios_path/xcarchive/
# 导出ipa存放文件路径
export_ipa_path=$export_ios_path/ipa/
# ExportOptions.plist app-store路径
export_options_plist_store=$project_path/shell_pack/ExportOptions.plist
# ExportOptions.plist app-hoc路径
export_options_plist_hoc=$project_path/shell_pack/ExportOptions_hoc.plist
# ExportOptions.plist app-dev路径
export_options_plist_dev=$project_path/shell_pack/ExportOptions_dev.plist
# 最后选择的环境
export_options_plist=$export_options_plist_store
# ======================== 蒲公英配置信息 ======================== #
# 蒲公英api_key
api_key=""
# 蒲公英iOS二维码地址
pgyer_ios_code_url=""
# 蒲公英安卓二维码地址
pgyer_android_code_url=""

从上面的代码里,我这边主要分了5个模块

命令参数配置

如果你想修改默认的配置参数,你可以修改这个模块
比如修改默认的上传环境为
upload_type=2
这样默认上传的就是蒲公英了,当然我们也可以通过shell参数进行修改上传环境

项目路径配置

默认的打包工具shell_pack存放路径如下所示

如图所示,shell_pack文件,默认是放在项目根目录下,如果你想把shell_pack放到其他地方,请修改获取项目路径配置参数project_path=$(dirname $(pwd))(修改成项目的路径,默认打包工具放在项目根目录下)

安卓打包配置

安卓需要修改的配置项就是安卓渠道,这个可以根据你们项目需求进行修改,
apk_channels=(HUAWEI VIVO YYB)

iOS打包配置

这里我只实现了一种上传商店的方式,就是配置商店账号专属秘密的形式,进行商店上传的.所以这里需要修改的配置就是
xcrun_u="" xcrun_p=""
  • 蒲公英配置
  • 只需要修改api_key即可

脚本使用

shell_pack打包工具文件,放到你项目的根目录下.如下所示

  • 在终端进入到shell_pack目录下
  • xx@xxx shelltest

Flutter Shell自动化打包解放双手的更多相关文章

  1. 为什么PATH不适用于从Xcode执行的自定义shell脚本?

    我观察到Xcode在运行脚本阶段执行的自定义shell脚本没有设置任何环境变量.他们有很多其他变量,但不是PATH.有可能解决这个问题,怎么样?我只想运行一个应该在路径中的工具,我不想开始手动检查可能的位置.解决方法你可以明确地找到用户.bashrc,.profile等.或者更好的是,运行类似的东西这不会有污染其他变量的风险.

  2. ios – Xcode Server 4.0 git从构建触发脚本推送

    我为一个托管在github上的项目安装了一个XcodeBot.我按照步骤和设置机器人来使用我现有的SSH密钥.验证成功,项目结算和建立.然后,我在预触发器操作中添加了一个shell脚本,它增加了plist中的版本,将其标记,并将该更改提交到github.但是当我尝试从shell脚本执行gitpush时,我得到:–推送到git@github.com:spex-app/spex-ios.git权限被拒

  3. ios – 超时等待120秒的模拟器启动

    看起来像Teamcity代理(TC版本是9.0EAP)不能通过测试shell脚本运行iOS模拟器.我正在使用BuildStep:命令行,它运行自定义脚本并将参数传递给它.通过使用shell脚本../bin/mac.launchd.sh,在MacOSXYosemite10.10上启动了Teamcity代理.构建日志错误:我的shell脚本进行测试:我也试过从这个question的解决方案,但没有帮助

  4. 在附加到XCode项目的shell脚本中无法识别$SRCROOT

    尝试运行附加到我的xcode项目的简单脚本,如下所示……如果我在XCode之外运行脚本似乎运行正常但是从XCode运行时我收到以下错误…似乎SRCROOT变量在脚本中是不可检测的,但我的理解是这是应该传递并可由脚本访问的环境变量之一.任何想法?解决方法原来这是我的错.该剧本实际上根本没有被调用.在XCode中,我指的是使用脚本的路径…更正了问题,我现在可以从我的脚本访问$SRCROOT.

  5. Flutter中文教程-Cookbook

    Flutter中文网的Cookbook中包含了在编写Flutter应用程序时常见问题及示例。设计基础使用主题共享颜色和字体样式Images显示来自网上的图片用占位符淡入图片使用缓存图Lists创建一个基本list创建一个水平list使用长列表创建不同类型子项的List创建一个gridList处理手势处理点击添加Material触摸水波效果实现滑动关闭导航导航到新页面并返回给新页面传值从新页面返回数据给上一个页面网络从网上获取数据进行认证请求使用WebSockets

  6. swift – Xcode 8 Shell脚本调用错误

    我试图解决这个问题几个小时,但它仍然存在.在论坛上尝试了一切,没有任何帮助.我正在使用Cocoapods最新版本1.2.0.beta.1当我尝试构建项目时,它给了我:再次安装pod并运行该项目.使用命令:

  7. android – 来自adb的’grep’命令的问题

    当我用adb写的时候:我得到错误输出:但如果我将它拆分为两个操作符:它工作正常.如果唯一的方法是将它拆分为两个–首先进入adbshell,然后运行Inquire,有一种方法可以从c#中执行此操作吗?

  8. 如何在Android Shell中获得以毫秒为单位的时间?

    3个我正在尝试制作一个在Android上运行的shell脚本.我需要以比秒更精确的时间来测量时间–毫秒或纳秒.我怎样才能在AndroidShell中执行此操作?id=stericson.busybox&hl=en然后你可以这样做:adbshell“busyBoxdate%s”以秒为单位获得时间:adbshell“busyBoxdate%N”获得纳秒秒.

  9. android – 通过ADB更改设备语言

    我想通过亚行改变语言.我试试:但我得到错误:怎么了?我想在物理设备上执行此操作解决方法您的错误与adb无关.您只是不了解本地shell如何处理命令.您正在做的是在本地运行这些命令:您看到的错误消息来自本地shell(即系统上没有setprop可执行文件,启动和停止命令具有非可选参数.正确的命令是或者在最近的Android版本中:

  10. android-studio – 未配置Dart SDK

    Initializinggradle…

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部