创建一个Flutter项目的时候,有多种方法。正常情况下的新项目的目录应该是下面这样的:

可以看到android和ios是在一个同级目录下面,它们共用flutter模块,和React Native个目录是一样的,这种时候其实2个项目公用一个Git开发会方便些。但是我们目前2个平台的项目在2个Git上,另外如果强行把2个项目放在一个地方,不但涉及到项目结构的调整,后期开发和代码管理上也可能混乱,比如git提交有可能一会儿是iOS,一会儿又是Android,还有可能是Dart,对于执行的大前端概念的公司可能还好些,如果是平台分组的公司来说git管理起来的确不是很方便。
有没有一种办法在不影响现有开发流程的基础上,很好的处理这3块内容呢?目前能想到是下面2种方法:
- Flutter代码单独保存在一个Git中,每次提交的时候,触发CI工具(比如Jenkins)自动更新生成远程私有库,然后在iOS中通过pod版本(Android上通过Maven版本)来更新同步。
- Flutter代码一样单独保存在一个Git中,把Flutter代码以git的submodule形式放在iOS项目或者Android项目里面,每次通过Git拉取代码即可。
2种方法其实都可以,我目前采用的第二种方法,原因是相对来说好操作些。不过后续我会调整成第一种方式(目前我们已经搭建了pod和maven私有库)。
下面详细说明下第二种方法的操作流程:
- 首先把Flutter代码提交到Git中
- 到对应iOS或者Android项目需要加入的Flutter代码的目录中
- 添加子Git项目,运行下面命令:
// ***.git 改成第一步中git路径,my_flutter是项目中文件夹的名字。
git submodule add ***.git my_flutter
-
我们使用了三方工具Sourcetree来管理Git,这里在Sourcetree中我把本地代码和线上代码进行关联(通过 “添加已经存在的本地仓库” 来关联),方便我们后续Flutter代码也通过Sourcetree来管理。
image.png
针对拉取iOS或者Android代码,不能主动拉取Flutter代码的问题,我写了下面Shell脚本:
#! /bin/sh
# 初始化submodule
git submodule init
git submodule update
# 根据环境切换分支
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脚本,可以和一些工具联合起来使用:
-
放在Xcode的Run Script中,让Xcode编译的时候主动更新Flutter
image.png
-
在Android Studio中通过task来让每次clean项目时候自动运行
task updateFlutterTask(type: Exec) {
workingDir '../'
commandLine 'sh', 'setupFlutter.sh'
}
project.afterEvaluate {
updateFlutterTask.execute()
}
- 配合CI工具来使用,比如Jenkins。Shell已经预留环境和版本管理。
iOS中运行Xcode,Android中运行Android Studio,Flutter可以直接运行
flutter run
。三部分互不干扰,各自开发,岂不美哉。
项目分离开后,如果从原生代码跳转Flutter层呢?
Flutter-现有项目添加Flutter之跳入Flutter
网友评论