美文网首页
Flutter远程组件最佳实践

Flutter远程组件最佳实践

作者: 盲果冻 | 来源:发表于2019-08-12 10:23 被阅读0次

  之前写了一篇 Flutter远程依赖简单实践,比较初期的一些实践操作,虽能正常运行使用,但还是存在一些不便的问题,特别是 远程 pluginspod 引用依赖了脚本,导致非 flutter 开发人员接入繁琐,为此进行了一些优化

   flutter 的远程依赖我们希望达到的效果:
    1. 根据环境自动切换产物依赖,即 DebugRelease 环境下无需重新 pod install 也无需手动切换
    2. plugins 的依赖无需依靠脚本,看有哪些 plugins,同时不影响头文件引入代码的使用

  鉴于以上两点主要诉求,对之前 Flutter远程依赖简单实践 进行了一些操作优化,主要是产物形式有些变化,这篇就只进行步骤的详情说明了

  • 产物收集

  产物收集主要涉及就是 工程开发的相关原生代码, DebugRelease 环境下的 App.frameworkFlutter.frameworkflutter开发工程里所有引用的plugin,即工程文件夹的.flutter-plugins文件中的所有plugin
  产物收集过程很类似,其实就是分别 DebugRelease环境下进行 模拟器及真机编译 ,且解析 flutter-plugins 文件,对 pluginpluginX.a进一步包装成 pluginX.framework(方便引用),然后收集所有相关的产物,并对 .podspec 文件的版本自动+1
  因为过程基本一致,所以我们就说下 Debug 环境下的处理,Release 环境只有 build 指令不同而已

  Debug 环境下的产物收集

  1. Debug环境下进行编译

#分别进行真机编译及模拟器编译
#编译前先进行 clean
flutter clean 
flutter build ios --debug --no-simulator

#Debug 模拟器编译
flutter clean 
flutter build ios --debug --simulator

  2. 分别收集不同的产物

#收集iOS平台相关源码,同时包括plugin注册文件
#target_source_dir iOS业务代码收集后目标地址,res_source_dir iOS业务代码flutter工程中的源码地址
if [ -d "$target_source_dir" ]; then
   rm -rf $target_source_dir
fi
cp -rf $res_source_dir .
cp {$res_source_runner_dir/GeneratedPluginRegistrant.h,$res_source_runner_dir/GeneratedPluginRegistrant.m} $target_source_dir

#收集 Flutter.framework 及 App.framework 等,target_debug_dir 产物收集后目标地址,res_dir 产物生成的文件夹,即 flutter工程地址/ios/Flutter 这里
if [ -d "$target_debug_dir" ]; then
    rm -rf $target_debug_dir
fi
mkdir -p $target_debug_dir
cp -R $res_dir/* $target_debug_dir

#收集 plugins 的 .a产物及
while read -r line
    do
      if [[ ! "$line" =~ ^// && ! "$line" =~ ^# ]]; then
        array=(${line//=/ })
        pluginName=${array[0]}
        iosClasses=${array[1]}ios/Classes
        if [ -d $iosClasses ]; then
          plugin=$target_plugins/$pluginName
          if [ ! -d $plugin ]; then
            mkdir $plugin
          fi
          cp -R $res_plugins_build/$pluginName/lib${pluginName}.a $plugin/lib${pluginName}_${target_plagin_suffix}.a
        fi
     fi
    done < $res_plugins

  3. 合并 Debug真机模拟器相关产物

#合并 App.framework
lipo -create $res_dir/App.framework/App $target_debug_dir/App.framework/App -output $target_debug_dir/App.framework/App

# 包装 pluagins 的 .a 产物为 .framework
mkdir -p $pluginName.framework/Versions/A/Headers
mkdir -p $pluginName.framework/Versions/A/Resources
# == 软链接
ln -s A $pluginName.framework/Versions/Current
ln -s Versions/Current/Headers $pluginName.framework/Headers
ln -s Versions/Current/Resources $pluginName.framework/Resources
ln -s Versions/Current/$pluginName $pluginName.framework/$pluginName
#== 合并
lipo -create \
     $plugin/lib${pluginName}_debug_os.a \
     $plugin/lib${pluginName}_debug_simulator.a \
     -o $pluginName.framework/Versions/A/$pluginName
#== 收集头文件
for header in `find "$iosClasses" -name *.h`; do
     cp -f $header $pluginName.framework/Versions/A/Headers/
done

  4. .podspec 版本自动 +1

newVersion=$(echo ${lastVersion} | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{if(length($NF+1)>length($NF))$(NF-1)++; $NF=sprintf("%0*d", length($NF), ($NF+1)%(10^length($NF))); print}') 
gsed  -i "s/${line}/s.version='${newVersion}'/g" $podPath
  Release 环境下的产物收集

   Release 产物同 Debug 大同小异,只是编译命令的不同

flutter clean
flutter build ios --release --no-simulator
  • flutter 远程引用

    pod 'LYFlutter', :podspec => "http://.../LYFlutter.podspec"
    pod 'Flutter_Debug', :podspec => "http://.../Flutter_Debug.podspec", :configurations => ['Debug']
    pod 'Flutter_Release', :podspec => "http://.../Flutter_Release.podspec", :configurations => ['Release']

   这是优化后的远程组件依赖,可能有更好的做法,目前对我们来说确是相对较便利的,完整的收集脚本👇这里
   flutter本地引用依然如上一篇文字所示

相关文章

  • Flutter远程组件最佳实践

      之前写了一篇 Flutter远程依赖简单实践,比较初期的一些实践操作,虽能正常运行使用,但还是存在一些不便的问...

  • flutter 最佳实践和提示

    Flutter 最佳实践和提示 翻译自 https://medium.com/flutter-community/...

  • 基于Flutter2.0,语法空安全,Provider MVVM

    前言 BaseFlutter开源项目基于Flutter2.0,语法上空安全,是Provider MVVM的最佳实践...

  • flutter + getx 最佳实践

    仓库地址:github.com/xieyezi/flu…[https://link.juejin.cn/?targ...

  • 组件化开发实践

    组件化思路很多,文章也很多,参考之后选择 casatwy / CTMediator 作为最佳实践https://...

  • [Django] 文件上传套装-filepond

    在我开发Django项目中,文件上传的最佳实践为采用 filepond 组件。 这个组件为前端提供了vue适配 ...

  • React 组件性能优化

    React 组件性能优化最佳实践 React 组件性能优化的核心是减少渲染真实 DOM 节点的频率,减少 Virt...

  • Flutter - UI基础

    Flutter基础组件用Flutter构建漂亮的UI界面 - 基础组件篇Flutter滚动型容器组件 - List...

  • Flutter远程依赖简单实践

      19年初,准备尝试 Flutter 实现部分业务页面,一个因为 Native 主工程已经较为庞大,一个因为目前...

  • dubbo三

    九、最佳实践分布式应用和单体应用的主要区别是本地调用和远程调用,解决的主要问题都是和远程调用相关。首先,远程调用的...

网友评论

      本文标题:Flutter远程组件最佳实践

      本文链接:https://www.haomeiwen.com/subject/byvfdctx.html