Monday, May 18, 2020

打造 Windows 隨身程式系統

在 Windows 操作系統上開發套件, 不僅希望這個套件能夠在 Mac OS X 與 Linux 上運行, 而且整個程式環境都能放入一個 USB 隨身碟, 在任何一台乾淨的 64 位元 Windows 10 操作系統中都能正常運行. 不受限制, 因此需要打造一個隨身程式系統.

啟動批次檔案

從以下這個 start.bat 批次啟動檔案, 大致可以看出此一可攜程式系統所包含的內容:

@echo off
set Disk=y
subst %Disk%: "data"

%Disk%:

set HomePath=%Disk%:\home_no_proxy
set HomeDrive=%Disk%:\home_no_proxy
set Home=%Disk%:\home_no_proxy
set USERPROFILE=%Disk%:\home_no_proxy

REM 將系統 Python 程式的 io 設為 utf-8
set PYTHONIOENCODING="utf-8"

set PYTHONPATH=%Disk%:\Python38\DLLs;%Disk%:\Python38\Lib;%Disk%:\Python38\Lib\site-packages;
set PYTHONHOME=%Disk%:\Python38

REM for Java and Android SDK
set java_home=%Disk%:\java\jdk8u222-b10
set ANDROID_SDK_home=%Disk%:\home_no_proxy
set GRADLE_USER_home=%Disk%:\home_no_proxy
set ANDROID_SDK_ROOT=%Disk%:\android\sdk
set ANDROID_Home=%Disk%:\android\sdk
set REPO_OS_OVERRIDE=windows

REM 設定跟 Python 有關的命令搜尋路徑
set path_python=%Disk%:\Python38;%Disk%:\Python38\Scripts;
REM 設定跟Git 有關的命令搜尋路徑
set path_git=%Disk%:\portablegit\bin;
REM 設定 msys2 64 位元的執行路徑
set path_msys2=%Disk%:\msys64\mingw64\bin;
REM set for LaTeX
set path_miketex=%Disk%:\miktex-portable\texmfs\install\miktex\bin\x64;
REM Flutter path
set path_flutter=%Disk%:\flutter\bin;%java_home%\bin;%Disk%:\Android\sdk;%Disk%:\Android\sdk\tools;%Disk%:\Android\sdk\tools\bin;%Disk%:\Android\sdk\emulator;%Disk%:\Android\sdk\platform-tools;%Disk%:\flutter\bin\cache\dart-sdk\bin;%Disk%:\vscode;

path=%Disk%:;%path_python%;%path_git%;%path_msys2%;%path_miketex%;%path_flutter%;%path%;

start /MIN cmd.exe
start /MIN cmd.exe
start /MIN cmd.exe
start /MIN cmd.exe

start /MIN %Disk%:\wScite\SciTE.exe
start /MIN %Disk%:\wScite\SciTE.exe

Exit

關閉隨身系統的批次檔案 stop.bat, 只將 python, scite 與 dos 命令列關閉, 若需要關閉其他可能開啟的套件, 可以自行加入:

@echo off
set Disk=y
path=%PATH%;

taskkill /IM python.exe /F
taskkill /IM pythonw.exe /F

taskkill /IM scite.exe /F

REM 終止虛擬硬碟與目錄的對應
subst %Disk%: /D
REM 關閉 cmd 指令視窗
taskkill /IM cmd.exe /F

EXIT

此一隨身系統安裝配置以 MSYS2Flutter 較具挑戰性.

MSYS2

首先與 MSYS2 的代理主機設定位於 Y:\msys64\etc\wgetrc. 接下來為了可以編譯 C++ 程式, 必須安裝

pacman -S mingw-w64-x86_64-gcc

pacman -S mingw-w64-x86_64-toolchain

而列出 MSYS2 中所安裝的模組:

pacman -Q

為了編譯 [Range3], 必須額外安裝:

pacman -S mingw-w64-x86_64-ffmpeg

pacman -S mingw-w64-x86_64-qt5

pacman -S mingw-w64-x86_64-qt5-static

編譯 Range3

git clone https://github.com/Range-Software/range3.git

start Y:\msys64\mingw64.exe

cd \y\tmp\fem_ex\range3

./scripts/build.sh --clean && ./scripts/create_package.sh

而為了讓 svg 格式的 icons 能夠正確顯示, 必須納入 Qt5Svg.dll

Flutter

至於現階段 Flutter 的安裝配置問題源自 Android sdk 的最新版 tools 與最新版的 Flutter 並不相容. 具體原因是: 目前的 Flutter 必須使用舊版的 Android sdk 中的舊版 tools.

使用者若從 Android 官方網站下載 tools 工具, 試圖與 Flutter 配合, 將會在執行:

flutter doctor

時將出現 Android sdk licenses 尚未完成. 但是若再以:

flutter doctor --android-licenses

就會出現 Java setting 錯誤.

解決方案

處理上述 Flutter 與最新版 Android 無法相容的問題, 必須借助:

sdkmanager --sdk_root=y:\android\sdk tools

安裝舊版的 Android sdk tools, 問題是 sdkmanager 工具就位於 tools 目錄中, 因此必須先將新版的 tools 目錄改名為 tools_new, 並配合將 tools_new/bin 設為 start.bat 中的 PATH, 可攜系統啟動後, 以:

sdkmanager --sdk_root=y:\android\sdk tools

安裝舊版的 Android sdk tools 後, 再將 PATH 路徑改為舊版 tools/bin.

之後再以

flutter doctor --android-licenses

同意使用授權後, 就可以接續進行 Flutter 套件的開發.

No comments:

Post a Comment