創(chuàng)建一個(gè)Flutter項(xiàng)目的時(shí)候,有多種方法。正常情況下的新項(xiàng)目的目錄應(yīng)該是下面這樣的:

可以看到android和ios是在一個(gè)同級(jí)目錄下面,它們共用flutter模塊,和React Native個(gè)目錄是一樣的,這種時(shí)候其實(shí)2個(gè)項(xiàng)目公用一個(gè)Git開發(fā)會(huì)方便些。但是我們目前2個(gè)平臺(tái)的項(xiàng)目在2個(gè)Git上,另外如果強(qiáng)行把2個(gè)項(xiàng)目放在一個(gè)地方,不但涉及到項(xiàng)目結(jié)構(gòu)的調(diào)整,后期開發(fā)和代碼管理上也可能混亂,比如git提交有可能一會(huì)兒是iOS,一會(huì)兒又是Android,還有可能是Dart,對于執(zhí)行的大前端概念的公司可能還好些,如果是平臺(tái)分組的公司來說git管理起來的確不是很方便。
有沒有一種辦法在不影響現(xiàn)有開發(fā)流程的基礎(chǔ)上,很好的處理這3塊內(nèi)容呢?目前能想到是下面2種方法:
- Flutter代碼單獨(dú)保存在一個(gè)Git中,每次提交的時(shí)候,觸發(fā)CI工具(比如Jenkins)自動(dòng)更新生成遠(yuǎn)程私有庫,然后在iOS中通過pod版本(Android上通過Maven版本)來更新同步。
- Flutter代碼一樣單獨(dú)保存在一個(gè)Git中,把Flutter代碼以git的submodule形式放在iOS項(xiàng)目或者Android項(xiàng)目里面,每次通過Git拉取代碼即可。
2種方法其實(shí)都可以,我目前采用的第二種方法,原因是相對來說好操作些。不過后續(xù)我會(huì)調(diào)整成第一種方式(目前我們已經(jīng)搭建了pod和maven私有庫)。
下面詳細(xì)說明下第二種方法的操作流程:
- 首先把Flutter代碼提交到Git中
- 到對應(yīng)iOS或者Android項(xiàng)目需要加入的Flutter代碼的目錄中
- 添加子Git項(xiàng)目,運(yùn)行下面命令:
// ***.git 改成第一步中g(shù)it路徑,my_flutter是項(xiàng)目中文件夾的名字。
git submodule add ***.git my_flutter
-
我們使用了三方工具Sourcetree來管理Git,這里在Sourcetree中我把本地代碼和線上代碼進(jìn)行關(guān)聯(lián)(通過 “添加已經(jīng)存在的本地倉庫” 來關(guān)聯(lián)),方便我們后續(xù)Flutter代碼也通過Sourcetree來管理。
image.png
針對拉取iOS或者Android代碼,不能主動(dòng)拉取Flutter代碼的問題,我寫了下面Shell腳本:
#! /bin/sh
# 初始化submodule
git submodule init
git submodule update
# 根據(jù)環(huán)境切換分支
cd ./my_flutter/
git fetch origin
if [ $1 ] && [ $1 = Release ]
then
echo '切換到master分支'
git reset --hard tags/v0.0.1
else
echo '切換到develop分支'
git reset --hard origin/develop
fi
git pull
flutter packages get
# 針對iOS的Shell
# cd ..
# pod install
上面Shell腳本,可以和一些工具聯(lián)合起來使用:
-
放在Xcode的Run Script中,讓Xcode編譯的時(shí)候主動(dòng)更新Flutter
image.png 在Android Studio中通過task來讓每次clean項(xiàng)目時(shí)候自動(dòng)運(yùn)行
task updateFlutterTask(type: Exec) {
workingDir '../'
commandLine 'sh', 'setupFlutter.sh'
}
project.afterEvaluate {
updateFlutterTask.execute()
}
- 配合CI工具來使用,比如Jenkins。Shell已經(jīng)預(yù)留環(huán)境和版本管理。
iOS中運(yùn)行Xcode,Android中運(yùn)行Android Studio,F(xiàn)lutter可以直接運(yùn)行
flutter run。三部分互不干擾,各自開發(fā),豈不美哉。
項(xiàng)目分離開后,如果從原生代碼跳轉(zhuǎn)Flutter層呢?
Flutter-現(xiàn)有項(xiàng)目添加Flutter之跳入Flutter

