Flutter 命令列打包

小德_koudle發表於2018-12-16

作者:騰訊 – 小德(koudleren 任曉帥)

前言

前面講了Flutter持續化整合上的演進之路,Flutter的工程為Flutter Model的工程,其中一個很重要的點就是如何在伺服器上打包,這個涉及到命令列打包,接下來看如何做。

Android打包

Android的命令列打包比較簡單,直接用gradle命令,在工程的目錄下執行如下的命令:

  1. 打debug包
$./gradlew assembleDebug複製程式碼
  1. 打Release包
$./gradlew assembleRelease複製程式碼

生成的aar包就在.android/Flutter/build/outputs/aar/目錄下

iOS打包

iOS打包比較複雜一些,需要用到一個打包的指令碼,這個指令碼在Flutter SDK裡,路徑為packages/flutter_tools/bin,有一個叫xcode_backend.sh的指令碼,首先分析這個指令碼:

if [[ $# == 0 ]];
then # Backwards-compatibility: if no args are provided, build. BuildAppelse case $1 in "build") BuildApp ;
;
"thin") ThinAppFrameworks ;
;
"embed") EmbedFlutterFrameworks ;
;
esacfi複製程式碼

可以看到這個指令碼有三個功能,分別是:

  1. build
  2. thin
  3. embed

把這個指令碼拷貝到工程的目錄,執行

  1. 第一步
$/bin/sh xcode_backend.sh build複製程式碼

然後你會發現有報錯,如下:

ERROR: Unknown FLUTTER_BUILD_MODE: .Valid values are 'Debug', 'Profile', or 'Release' (case insensitive).This is controlled by the FLUTTER_BUILD_MODE environment varaible.If that is not set, the CONFIGURATION environment variable is used.複製程式碼

這是因為少了一些環境變數,要把這些變數加上:

export FLUTTER_BUILD_MODE="" //有三個值:Debug  Profile   Releaseexport FLUTTER_ROOT="" //Flutter SDK的目錄export FLUTTER_APPLICATION_PATH=""  //工程目錄export SOURCE_ROOT="${FLUTTER_APPLICATION_PATH
}
/.ios/Flutter"
//Flutter iOS程式碼的目錄export FLUTTER_TARGET="lib/main.dart" //dart程式碼export FLUTTER_BUILD_DIR="build" //build生成的路徑export ARCHS="armv7 arm64" //Flutter打包的Framework要支援的平臺複製程式碼
  1. 第二步
$/bin/sh xcode_backend.sh thin複製程式碼

同樣也要加上環境變數:

export SOURCE_ROOT=".../.ios/Flutter" //Flutter iOS程式碼的目錄export ARCHS="armv7 arm64" //Flutter打包的Framework要支援的平臺export TARGET_BUILD_DIR="${SOURCE_ROOT
}
"
//build生成的路徑export app_path="${TARGET_BUILD_DIR
}
/Flutter"
//Flutter打包的Framework所在的路徑export frameworks_dir="${app_path
}
"
//Flutter打包的Framework所在的路徑複製程式碼

綜上,要加的環境變數如下:

export FLUTTER_BUILD_MODE="" //有三個值:Debug  Profile   Releaseexport FLUTTER_ROOT="" //Flutter SDK的目錄export FLUTTER_APPLICATION_PATH=""  //工程目錄export SOURCE_ROOT="${FLUTTER_APPLICATION_PATH
}
/.ios/Flutter"
//Flutter iOS程式碼的目錄export FLUTTER_TARGET="lib/main.dart" //dart程式碼export FLUTTER_BUILD_DIR="build" //build生成的路徑export ARCHS="armv7 arm64" //Flutter打包的Framework要支援的平臺export TARGET_BUILD_DIR="${SOURCE_ROOT
}
"
//build生成的路徑export app_path="${TARGET_BUILD_DIR
}
/Flutter"
//Flutter打包的Framework所在的路徑export frameworks_dir="${app_path
}
"
//Flutter打包的Framework所在的路徑複製程式碼

執行的命令如下:

$/bin/sh xcode_backend.sh build$/bin/sh xcode_backend.sh thin複製程式碼

生成產物在.../.iOS/Flutter中檢視,如果想修改生成產物的路徑,修改指令碼里derived_dir的值,如下:

  local derived_dir="${SOURCE_ROOT
}
/Flutter/Flutter"
if [[ -e "${project_path
}
/.ios"
]];
then derived_dir="${project_path
}
/.ios/Flutter/Flutter"
fi複製程式碼

來源:https://juejin.im/post/5c1637845188255525485b0c

相關文章