Browse Source
chore(scripts): 添加 Flutter 自动化打包脚本
chore(scripts): 添加 Flutter 自动化打包脚本
- 新增 Android 打包脚本 build_android.sh- 新增 iOS 打包脚本 build_ios.sh - 支持通过 --output 参数指定输出路径- 支持透传额外的 flutter build 参数 - 更新 README 文档说明使用方式ios
3 changed files with 143 additions and 0 deletions
Unified View
Diff Options
@ -0,0 +1,70 @@ |
|||||
|
#!/bin/bash |
||||
|
# usage: |
||||
|
# ./scripts/build_android.sh --output /absolute/path/to/dir_or_apk [extra flutter build args...] |
||||
|
|
||||
|
set -euo pipefail |
||||
|
|
||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
||||
|
|
||||
|
DEFAULT_OUTPUT_DIR="$PROJECT_ROOT/build/android_release" |
||||
|
DEFAULT_OUTPUT_PATH="$DEFAULT_OUTPUT_DIR/app-release.apk" |
||||
|
|
||||
|
OUTPUT_PATH="$DEFAULT_OUTPUT_PATH" |
||||
|
EXTRA_ARGS=() |
||||
|
|
||||
|
while [[ $# -gt 0 ]]; do |
||||
|
case "$1" in |
||||
|
--output=*) |
||||
|
OUTPUT_PATH="${1#*=}" |
||||
|
shift |
||||
|
;; |
||||
|
--output) |
||||
|
if [[ $# -lt 2 ]]; then |
||||
|
echo "参数错误: --output 需要一个路径" >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
OUTPUT_PATH="$2" |
||||
|
shift 2 |
||||
|
;; |
||||
|
*) |
||||
|
EXTRA_ARGS+=("$1") |
||||
|
shift |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
pushd "$PROJECT_ROOT" >/dev/null |
||||
|
echo "📦 清理旧构建..." |
||||
|
flutter clean |
||||
|
|
||||
|
echo "📚 获取依赖..." |
||||
|
flutter pub get |
||||
|
|
||||
|
echo "🤖 开始构建 Android APK..." |
||||
|
flutter build apk --release "${EXTRA_ARGS[@]}" |
||||
|
popd >/dev/null |
||||
|
|
||||
|
ARTIFACT_DIR="$PROJECT_ROOT/build/app/outputs/flutter-apk" |
||||
|
if [[ ! -d "$ARTIFACT_DIR" ]]; then |
||||
|
echo "未找到 APK 输出目录:$ARTIFACT_DIR" >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
BUILT_APK="$(find "$ARTIFACT_DIR" -maxdepth 1 -name '*.apk' -print | head -n 1)" |
||||
|
if [[ -z "$BUILT_APK" || ! -f "$BUILT_APK" ]]; then |
||||
|
echo "未找到构建出的 APK 文件" >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
if [[ "$OUTPUT_PATH" == *.apk ]]; then |
||||
|
TARGET_PATH="$OUTPUT_PATH" |
||||
|
mkdir -p "$(dirname "$TARGET_PATH")" |
||||
|
else |
||||
|
mkdir -p "$OUTPUT_PATH" |
||||
|
TARGET_PATH="$OUTPUT_PATH/$(basename "$BUILT_APK")" |
||||
|
fi |
||||
|
|
||||
|
cp "$BUILT_APK" "$TARGET_PATH" |
||||
|
echo "✅ 构建完成,APK 已保存到:$TARGET_PATH" |
||||
|
|
||||
@ -0,0 +1,49 @@ |
|||||
|
#!/bin/bash |
||||
|
# usage: |
||||
|
# ./scripts/build_ios.sh --output /absolute/path/to/output [extra flutter build args...] |
||||
|
|
||||
|
set -euo pipefail |
||||
|
|
||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
||||
|
|
||||
|
DEFAULT_BUILD_DIR="$PROJECT_ROOT/build/ios_release" |
||||
|
OUTPUT_DIR="$DEFAULT_BUILD_DIR" |
||||
|
EXTRA_ARGS=() |
||||
|
|
||||
|
while [[ $# -gt 0 ]]; do |
||||
|
case "$1" in |
||||
|
--output=*) |
||||
|
OUTPUT_DIR="${1#*=}" |
||||
|
shift |
||||
|
;; |
||||
|
--output) |
||||
|
if [[ $# -lt 2 ]]; then |
||||
|
echo "参数错误: --output 需要一个路径" >&2 |
||||
|
exit 1 |
||||
|
fi |
||||
|
OUTPUT_DIR="$2" |
||||
|
shift 2 |
||||
|
;; |
||||
|
*) |
||||
|
EXTRA_ARGS+=("$1") |
||||
|
shift |
||||
|
;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
mkdir -p "$OUTPUT_DIR" |
||||
|
|
||||
|
pushd "$PROJECT_ROOT" >/dev/null |
||||
|
echo "📦 清理旧构建..." |
||||
|
flutter clean |
||||
|
|
||||
|
echo "📚 获取依赖..." |
||||
|
flutter pub get |
||||
|
|
||||
|
echo "🚀 开始构建 iOS 安装包..." |
||||
|
flutter build ios --release --build-dir "$OUTPUT_DIR" "${EXTRA_ARGS[@]}" |
||||
|
popd >/dev/null |
||||
|
|
||||
|
echo "✅ 构建完成,产物目录:$OUTPUT_DIR" |
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save