windows下打包python脚本,支持自定义参数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
import datetime
import shutil
import sys
# ---------- 配置 ----------
# Flutter 路径,修改为你本地 Flutter 安装路径
FLUTTER_PATH = r"D:\flutter-3.29.2\flutter_windows_3.29.2-stable\flutter\bin\flutter.bat"
# 支持的渠道
CHANNELS = ["tencent", "h5"]
# 输出目录
OUTPUT_DIR = os.path.join("build", "app", "outputs", "flutter-apk")
# ---------- 工具函数 ----------
def run_flutter_command(cmd):
"""
在控制台执行 Flutter 命令,直接显示输出,避免 UnicodeDecodeError
"""
try:
process = subprocess.Popen(cmd)
process.wait()
return process.returncode
except FileNotFoundError:
print(f"错误: 未找到 Flutter 可执行文件 {FLUTTER_PATH}")
return -1
# ---------- 主流程 ----------
def build_channels():
now = datetime.datetime.now()
build_time = now.strftime("%Y-%m-%d-%H%M")
print("开始打包多渠道APK,时间:", build_time)
print("支持的渠道:", ", ".join(CHANNELS))
# 确保输出目录存在
os.makedirs(OUTPUT_DIR, exist_ok=True)
success_count = 0
for channel in CHANNELS:
print("\n正在打包渠道:", channel)
# 默认环境为 prod
env = "prod"
if len(sys.argv) > 1:
env = sys.argv[1] # 第一个参数作为环境,例如 python build_channels.py dev
print("当前打包环境:", env)
cmd = [
FLUTTER_PATH,
"build",
"apk",
f"--dart-define=ENV={env}",
f"--dart-define=CHANNEL={channel}",
"--release",
]
print("执行命令:", " ".join(cmd))
ret = subprocess.run(cmd, check=False, text=True, encoding="utf-8")
if ret.returncode != 0:
print(f"渠道 {channel} 构建失败,请检查 Flutter 输出")
continue
# 原始 APK
original_apk = os.path.join(OUTPUT_DIR, "app-release.apk")
if not os.path.exists(original_apk):
print(f"警告: 未找到构建后的 APK 文件 {original_apk}")
continue
# 新 APK 文件名
new_apk_name = f"turbobun-prod-{channel}-{build_time}.apk"
new_apk_path = os.path.join(OUTPUT_DIR, new_apk_name)
# 重命名
shutil.move(original_apk, new_apk_path)
print(f"渠道 {channel} APK 已保存为: {new_apk_name}")
success_count += 1
print("\n打包完成总结:")
print(f"成功打包渠道数: {success_count}/{len(CHANNELS)}")
print(f"构建时间: {build_time}")
def main():
print("Turbobun 多渠道APK打包工具")
print("=" * 30)
# 检查 Flutter 是否存在
if not os.path.exists(FLUTTER_PATH):
print(f"错误: 未找到 Flutter 可执行文件 {FLUTTER_PATH}")
sys.exit(1)
build_channels()
if __name__ == "__main__":
main()