技术经验谈 技术经验谈
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hss01248

一号线程序员
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 学习资料

  • 技术选型

  • 要点

    • dart语言核心要点
    • 工程化

      • flutter依赖管理
      • flutter代码模板优化和禁用.android文件夹刷新
      • flutter客户端项目适配web做的一些工作
      • web跨域问题终结者
      • flutter编译流程修改
        • flutter工程的模块化架构
        • flutter web编译瘦身
        • webview_flutter官方插件的增强-对inputfile和权限请求的支持
      • flutter异步
      • flutter工程化
      • flutter存储相关
      • flutter状态管理
      • flutter网络框架以及相关要点
      • flutter图片相关
      • flutter可观测性和调试
      • flutter插件开发
      • flutter路由管理
      • 遇到的问题
    • 经验

    • flutter
    • 要点
    • 工程化
    hss01248
    2022-10-17
    目录

    flutter编译流程修改

    # flutter条件编译以及shell脚本/dart脚本

    # 问题

    • 如何实现条件编译?
    • 能在yaml里写if-else条件判断吗?
    • 多package的工程,怎么做到package发布到pub的功能和本地path依赖的形式同时存在?
    • yaml里能自定义配置吗?
    • dart代码里怎么读取自定义配置?
    • 有类似spring boot那样的多个yaml,覆盖配置吗?

    # 1 多package的工程,怎么做到package发布到pub的功能和本地path依赖的形式同时存在?

    类似gradle工程发布到jitpack时,自动将本地依赖替换为远程依赖

    正常代码里是这样:

    dependencies:
      webview_flutter: ^3.0.4
      pkg_base_lib:
        path: ../pkg_base_lib
    
    1
    2
    3
    4

    希望发布时,运行 dart pub publish --dry-run 时,pkg_base_lib的path依赖自动替换为当前指定的某个版本号的依赖

    一般来说,只能自己写个shell脚本/dart脚本,在运行dart pub publish前调用,

    将yaml文件拷贝一份,将所有package里的path替换为远程依赖,

    然后运行publish,

    运行完成后,再将文件拷贝回来.

    # 2 yaml配置读取/编辑工具

    https://pub.dev/packages/yaml_config_reader

    只能读取assets下的文件,不能读pubspec.yaml

    https://pub.dev/packages/yaml 官方yaml读工具,推荐

    写yaml的工具: map转yaml: yaml_writer: ^1.0.2

    https://pub.dev/packages/process_run dart的命令行调用工具--> 无法接受用户输入. 那么使用dart pub publish --force可以不需要确认,无需交互

    https://pub.dev/packages/dcli

    # 3 flutter命令行支持的一些条件编译

    https://blog.deskangel.com/2021/06/16/flutter-conditional-compiling/

    Flutter下的实现原理主要是它可以通过编译参数指定不同的入口文件:

    flutter build apk --help
    ....
    -t, --target=<path>                 The main entry-point file of the application, as run on the
                                        device.
                                        If the "--target" option is omitted, but a file name is provided
                                        on the command line, then that is used instead.
                                        (defaults to "lib/main.dart")
    
    1
    2
    3
    4
    5
    6
    7

    另外,它也支持指定flavor,可以透传到gradle:

    --flavor                        Build a custom app flavor as defined by platform-specific build
                                        setup.
    
    1
    2

    # 编译脚本

    由于没有很好的办法对pubspec.yaml中的packages进行“条件控制”,比如没有找到办法创建诸如google_dependencies这样的入口,所以只能通过命令来进行控制:

    flutter pub remove --offline in_app_purchase
    flutter build appbundle --release --flavor=huawei -t lib/main.huawei.dart
    flutter pub add --offline in_app_purchase
    
    1
    2
    3

    针对huawei的编译,先移除google的in_app_purchase包,然后通过--flavor指定风味,通过-t指定flutter的main文件,编译完成后再把包加回去。

    # 4 命令行指定参数,dart代码内获取

    从 Flutter v1.17 开始,Flutter 命令工具增加了自定义参数的功能 --dart-define,我们可以用这个命令参数在打包或运行 App 时设置参数即可。

    首先确定 Flutter 版本,我的版本是 v1.22.6

    flutter run --dart-define=APP_CHANNEL=ZeroFlutter 
    
    1

    当然你可以传递多组参数

    flutter run --dart-define=APP_CHANNEL=ZeroFlutter --dart-define=OTHER_VAR=Dart 
    
    1

    在 Dart 代码中你需要这样写,一定是和命令参数是对应的

    // main.dart
    class EnvironmentConfig {
      static const APP_CHANNEL = String.fromEnvironment('APP_CHANNEL');
      static const OTHER_VAR = String.fromEnvironment('OTHER_VAR');
    } 
    
    1
    2
    3
    4
    5

    # 5 dart代码内部用到一些平台特有api导致编译失败时:

    https://github.com/fengdeyingzi/definetool

    # 1.在代码中加入宏注释

        // #ifdef WINDOWS
        print("hello windows");
        // #endif
    
        // #ifdef WEB
        print("hello web");
        // #endif
    
    1
    2
    3
    4
    5
    6
    7

    # 2.在代码所在目录运行findtool工具,并定义宏:WINDOWS

    这个命令可直接在本项目上操作来查看效果

        definetool -define WINDOWS 
    
    1

    在编译时若没有此宏,会将define与endif之间的内容进行/**/注释,若有宏,则进行解除注释。

    宏内定义的内容不要使用多行注释

    编辑 (opens new window)
    上次更新: 2022/12/15, 14:32:28
    web跨域问题终结者
    flutter工程的模块化架构

    ← web跨域问题终结者 flutter工程的模块化架构→

    最近更新
    01
    截图后的自动压缩工具
    12-27
    02
    图片视频文件根据exif批量重命名
    12-27
    03
    chatgpt图片识别描述功能
    02-20
    更多文章>
    Theme by Vdoing | Copyright © 2020-2025 | 粤ICP备20041795号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式