Flutter-远程Pod集成Flutter脚本优化

相关链接,如有需要请移步:
Flutter-已有iOS工程中加入Flutter之Cocoapods+Flutter环境方式集成
Flutter-已有iOS工程中加入Flutter之远程Pod产物方式集成
Flutter-远程Pod集成Flutter脚本优化

前段时间写了个pod远程仓库打包的脚本,感觉不太完善,有些缺点,最近抽空研究了下,做了些优化。

1. 脚本优化

截止到现在,打包并上传到远程仓库的脚本build_ios.sh长这样:

echo "进入到Flutter项目所在目录"
projectURL=$(cd $(dirname $0); pwd)

#echo $projectURL

cd ${projectURL}

#获取Flutter项目远程更新
git fetch
#拉取Flutter项目代码
git pull
echo "拉取代码结束"

# 读取控制台输入要打包的环境
read -p "请输入打包环境:1==Release, 0==Debug?  " configuration

echo "获取的输入结果: $configuration"

isRelease=true

if [ "0" == $configuration ]; then
    isRelease=false
fi

echo "对比结果是 $isRelease"
# 相应的环境
if [ $isRelease == true ]; then
    echo "选择了Release"
    #路径换成自己的生产pod对应的路径
    out='../iOSFlutterSDK/iOSFlutterSDK/ios_frameworks'
else
    echo "选择了Debug"
    #路径换成自己的测试pod对应的路径
    out='../iOSFlutterDevSDK/iOSFlutterDevSDK/ios_frameworks'
fi
#if [ -z $out ]; then
#    out='../iOSFlutterSDK/iOSFlutterSDK/ios_frameworks'
#fi

buildxc='buildxc'

echo "准备输出所有文件到目录: $out"

echo "清除所有已编译文件"
#flutter clean
rm -rf $out

# 拉取flutter依赖库
#flutter packages get

echo "编译flutter"
#flutter build ios --release --no-codesign
if [ $isRelease == true ]; then
    flutter build ios-framework --xcframework --no-debug --no-profile --no-universal --output=$buildxc
else
    //使用profile包,因为debug的包,在某些机型上不可用
    flutter build ios-framework --xcframework --no-release --no-debug --no-universal --output=$buildxc
fi

echo "编译flutter完成,编译所有文件到目录: $buildxc"

# 创建导出包的文件夹
mkdir $out

if [ $isRelease == true ]; then
    # 拷贝Release编译产物到指定目录
    cp -r $buildxc/Release/*.xcframework $out
else
    # 拷贝Debug编译产物到指定目录
    cp -r $buildxc/Profile/*.xcframework $out
fi

echo "删除编译完成的临时文件夹"
rm -rf $buildxc

read -p "是否需要推送到原生Pod仓库 yes/no? " shouldPush
read -p "请输入版本说明: " versionMsg

# 推送到远程,并打上tag
pushSpec(){
    if [ $isRelease == true ]; then
        # 拷贝Release编译产物到指定目录
        cd ../iOSFlutterSDK
    else
        # 拷贝Debug编译产物到指定目录
        cd ../iOSFlutterDevSDK
    fi
    
    echo "拉取远程Pod仓库代码"
    git fetch
    git pull

    #修改iOSFlutterSDK.podspec中s.version          = '0.1.4'

    # 读取iOSFlutterSDK.podspec的第11行
    # a=`cat iOSFlutterSDK.podspec|head -ne12`
    # echo $a
    
    if [ $isRelease == true ]; then
        a=`sed -n 11p iOSFlutterSDK.podspec`
    else
        a=`sed -n 11p iOSFlutterDevSDK.podspec`
    fi
    
    # echo $a #s.version = '0.1.4'
    # echo "删除最右边.开始向及其左边的数据"
    vs=${a##*.}
    # echo $vs
    oldNum=${vs%%\'*}
    # echo '当前版本:'$oldNum
    newNum=$((oldNum+1))
    # echo '新版本:'$newNum

    # echo "替换版本号"
    v=0.1.$newNum
    version="  s.version          = '$v'"
    echo $version
    
    #区分Release和Debug两种环境
    if [ $isRelease == true ]; then
        sed -i '' "s/$a/$version/" iOSFlutterSDK.podspec
    else
        sed -i '' "s/$a/$version/" iOSFlutterDevSDK.podspec
    fi

    # echo "add 并且commit"

    # git status
    # git rm --cached
    git add .
    #添加描述
    git commit -m "版本号:$v $versionMsg"

    # echo "添加tag"
    git tag -a $v -m "$v $versionMsg"

    # echo "连同tag推送到远程"
    git push
    git push --tags
}


if [ $shouldPush == "yes" ]; then
    echo "正在向远程仓库推送"
    pushSpec
else
    echo "不向远程仓库推送"
fi

# 以前的编译导出的包
#cp -r build/ios/Release-iphoneos/*/*.framework $out
#cp -r .ios/Flutter/App.framework $out
#cp -r .ios/Flutter/engine/Flutter.framework $out

效果图

2. 使用

build_ios.sh放到flutter项目的路径下,打包时,将脚本文件直接拖入到终端,直接回车即可,按照控制台的提示,输入相应的信息,就可以将pod仓库推送到远程了。

3. 修改iOS原生项目中的Profile文件

Profile文件本身也是脚本文件,凭借我临时抱佛脚的脚本功底,通过入参的形式,将Profile中的三方依赖,设置为可以根据环境(Debug或者Release)更替为相应的SDK,同时支持三种环境集成:

  1. 集成Debug的SDK,pod install命令行:
env PODFILE_TYPE='development_sdk' pod install
#env PODFILE_TYPE='development_sdk' pod update
  1. 集成Release的SDK,pod install命令行为
env PODFILE_TYPE= 'release_sdk' pod install
#env PODFILE_TYPE='release_sdk' pod update
  1. 集成本地flutter环境的SDK,pod install命令行为
pod install

具体Profile中的代码修改为下面这样:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/aliyun/aliyun-specs.git'

platform :ios, '9.0'

#环境变量
#development_sdk 使用远程pod集成,flutter环境为Debug
#release_sdk 使用远程pod集成,flutter环境为Release
#local_flutter 使用本地Flutter环境集成,Debug、Release 开发者在scheme中自己选择
case ENV['PODFILE_TYPE']
  when 'development_sdk'
  when 'release_sdk'
  else
  flutter_application_path = '这里是你的flutter_module对应的路径'
  load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
end


use_frameworks!
#swift_version = '4.1'
target "QianGunGun" do
  pod 'AFNetworking'
  case ENV['PODFILE_TYPE']
    when 'development_sdk'
    # 测试环境
    pod 'iOSFlutterDevSDK', :git => 'https://codeup.aliyun.com/xxxx/iOSSDK/iOSFlutterDevSDK.git'
    when 'release_sdk'
    # 生产环境 Flutter SDK, 因为我们自己的gitlab限制大文件传输,所以使用了其他
    pod 'iOSFlutterSDK', :git => 'https://codeup.aliyun.com/xxxx/iOSSDK/iOSFlutterSDK.git'
    else
    ## ==============Flutter ==============_
    ## Flutter 模块的路径 pod update --verbose --no-repo-update_
    install_all_flutter_pods(flutter_application_path)
    ## ==============Flutter ==============_
  end
  
  
  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
        config.build_settings['ENABLE_BITCODE'] = 'NO'
      end
    end
  end
  
end

4. Jenkins中配置

在Jenkins项目->General->参数化构建中添加外化参数分别为:
use_remote_sdk:布尔值参数,是否使用远程SDK集成
env_archive:选项参数,Build环境,使用Release还是Debug(如果是使用本地flutter集成环境,则必须为Release)
flutter_branch:选项参数,flutter项目其Git分支

在Jenkins项目->Build->添加一个执行脚本,如下:

if  [ $use_remote_sdk == true ]; then
        echo "===Use remote sdk to integrate flutter==="
        if [ $env_archive == "Release" ]; then
            echo "====Release Flutter"
            env PODFILE_TYPE=release_sdk pod install
        else
            echo "====Debug Flutter"
            env PODFILE_TYPE=development_sdk pod install
        fi
else
        echo "===Use local environment to integrate flutter==="
        projectURL=`pwd`
        echo "current dictionary:$projectURL"
        cd ../app-flutter #进入到flutter项目路径
        # 此处应该先校验一下分支名是否存在,但是我还没找到合适的方法
        # 目前是每次有新分支了,先在打包机器上Flutter项目中,手动切出一个本地分支
        git pull origin $flutter_branch
        
        flutter pub get
        cd $projectURL
        pod install
fi

至此,脚本基本完成了,可以尝试使用了,如有问题,欢迎批评指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容