前言

咱们在写 flutter 项目时每次履行 pub clean 后, .ios 项目会重新创建,项目的 bitcode 会重置为 true,项目就是编译失利,信任咱们都遇到过,每次都需求手动设置 bitcode = false,考虑这种手动操作繁琐让我团队成员不胜其扰。同时我近期有学习 Python ,就拿这练练手,通过 py 脚本一键处理这个问题,咱们也就能愉快开发了~

一)Python 实战:解决 Flutter 项目 bitcode = true 编译失败问题

bitcode 问题

一)Python 实战:解决 Flutter 项目 bitcode = true 编译失败问题

考虑

之前有想过用 shellruby 等去实现这个,搜索下发现有人提了思路 传送门,我测验过用 stackoverflow上 25 个赞的主张后,测验发现能履行,但编译失利就放弃。后来选用 pbxproj 刚好是 Python 写的,是个契机,学以致用。

一)Python 实战:解决 Flutter 项目 bitcode = true 编译失败问题

#pod install
xcodebuild -target house591 -configuration Debug ENABLE_BITCODE=YES
xcodebuild -target house591 -configuration Test ENABLE_BITCODE=YES
xcodebuild -target house591 -configuration Release ENABLE_BITCODE=YES

环境

首要需求的是装置 Python3 环境,这块我就不细说了。假如想用 py 虚拟环境,能够运用 pyenv 参阅这篇 传送门 (by 洵锋同学写的),我用的是 Python 3.8.10

插件

设置 Xcode build Setting 运用的是第三方插件 传送门

# 装置如下
pip3 install pbxproj

运用设置 Flutter 项目 Bitcode 中心代码

# 设置 bitcode
def set_bit_code_path(path, is_close_bitcode=True):
    project = XcodeProject.load(path)
    bitcode_str = "NO"
    if not is_close_bitcode:
        bitcode_str = "YES"
    print(f"set_bit_code_path 当时项目途径:{path} bitcode_str: {bitcode_str}")
    set_bit_code_flag(project, bitcode_str, configuration_name="Debug")
    set_bit_code_flag(project, bitcode_str, configuration_name="Profile")
    set_bit_code_flag(project, bitcode_str, configuration_name="Release")
    project.save()
# 设置 bitcode 参数
def set_bit_code_flag(project, bitcode_str, target_name="Runner", configuration_name='Debug'):
    project.set_flags('ENABLE_BITCODE', bitcode_str, target_name=target_name, configuration_name=configuration_name)

运用

方法一

  • 直接终端履行,咱们自己是运用 ssh 工具 shuttle 一键履行-现在咱们的项目往 Flutter 技能栈的方向转,所以建了三个 Flutter module 业务组件,因此我这边只建三个 Flutter 项目的脚本途径,后续视情况弥补脚本指令。
    一)Python 实战:解决 Flutter 项目 bitcode = true 编译失败问题
  • 当然咱们也能够直接终端履行,如下
cd /Users/zhengzeqin/Desktop/GitLab/TWHouseScript; python disable_bitcode.py -p '/Users/zhengzeqin/Desktop/GitLab/tw591_salehouse' -s close
  • 其实 shuttle 的指令是用 json 来设置,能够结合 jsonnet 去动态生成,这样就能够复用给别人

方法二

假如不想像上述那样,多个项目合作 shuttle 指令。途径咱们也能够写在脚本里,每个 Flutter 项目装备自己的 Python 脚本指令,记住界说好自己的项目途径就好,详细如下

# 界说项目 module 文件名
_module_names = ['tw591_salehouse']
# 项目的父目录
_file_path = "/Users/zhengzeqin/Desktop/GitLab/"
# flutter project.pbxpro
_flutter_pro = '/.ios/Runner.xcodeproj/project.pbxproj'
# 设置 bitcode
def set_bit_code(file_path, module_name):
    path = file_path + module_name + _flutter_pro
    # print("当时项目途径:", path)
    set_bit_code_path(path)
# 本地文件装备途径处理 bitcode
def handle_projects_bit_code():
    for module_name in _module_names:
        set_bit_code(_file_path, module_name)
if __name__ == "__main__":
    # 本地文件装备途径处理 bitcode
    handle_projects_bit_code()
    # 假如是 flutter 同级下装备能够这样读取 project.pbxproj 途径
    current_path = os.path.abspath(os.curdir) + _flutter_pro
    print(current_path)

完整脚本代码

# -*- coding: utf-8 -*-
# -*- author: zhengzeqin -*-
# -*- date: 2022-03-01 -*-
# 需求装置依靠库
# pip3 install pbxproj
import os
import getopt
from pbxproj import XcodeProject
import sys
# 界说 flutter 项目 module 文件名
_module_names = ['tw591_salehouse']
# 项目的父目录
_file_path = "/Users/zhengzeqin/Desktop/GitLab/"
# flutter project.pbxpro
_flutter_pro = '/.ios/Runner.xcodeproj/project.pbxproj'
# 本地文件装备途径处理 bitcode
def handle_projects_bit_code():
    for module_name in _module_names:
        set_bit_code(_file_path, module_name)
# 设置 bitcode
def set_bit_code(file_path, module_name):
    path = file_path + module_name + _flutter_pro
    # print("当时项目途径:", path)
    set_bit_code_path(path)
# 设置 bitcode
def set_bit_code_path(path, is_close_bitcode=True):
    project = XcodeProject.load(path)
    bitcode_str = "NO"
    if not is_close_bitcode:
        bitcode_str = "YES"
    print(f"set_bit_code_path 当时项目途径:{path} bitcode_str: {bitcode_str}")
    set_bit_code_flag(project, bitcode_str, configuration_name="Debug")
    set_bit_code_flag(project, bitcode_str, configuration_name="Profile")
    set_bit_code_flag(project, bitcode_str, configuration_name="Release")
    project.save()
# 设置 bitcode 参数
def set_bit_code_flag(project, bitcode_str, target_name="Runner", configuration_name='Debug'):
    project.set_flags('ENABLE_BITCODE', bitcode_str, target_name=target_name, configuration_name=configuration_name)
if __name__ == "__main__":
    # 本地文件装备途径处理 bitcode
    # handle_projects_bit_code()
    # 假如是 flutter 同级下装备能够这样读取 project.pbxproj 途径
    # current_path = os.path.abspath(os.curdir) + _flutter_pro
    # print(current_path)
    argv = sys.argv[1:]
    # 项目途径
    project_path = ""
    # 默许关闭
    is_close_bitcode = True
    try:
        opts, args = getopt.getopt(argv, "p:s:", ["path=", "switch="])
    except getopt.GetoptError:
        print('disable_bitcode.py -p "项目途径"')
        sys.exit(2)
    print("opts ===>", opts)
    for opt, arg in opts:
        if opt in ["-p", "--path"]:
            project_path = arg
            if len(project_path) == 0:
                print('请输入项目的地址')
                sys.exit('请输入项目的地址')
        if opt in ["-s", "--switch"]:
            if arg == "open":
                is_close_bitcode = False
            if arg == "close":
                is_close_bitcode = True
    # 获取需求修复项目的途径
    path = project_path + _flutter_pro
    # 设置 bitcode = false
    set_bit_code_path(path, is_close_bitcode)

后序考虑

上述处理的是 iOS bitcode = true 编译失利问题,其实 Android 也有个默许版本低引起编译失利问题,是不是咱们也能够通过脚本去处理呢?