Flutter-遠(yuǎn)程Pod集成Flutter腳本優(yōu)化

相關(guān)鏈接,如有需要請移步:
Flutter-已有iOS工程中加入Flutter之Cocoapods+Flutter環(huán)境方式集成
Flutter-已有iOS工程中加入Flutter之遠(yuǎn)程Pod產(chǎn)物方式集成
Flutter-遠(yuǎn)程Pod集成Flutter腳本優(yōu)化

前段時(shí)間寫了個pod遠(yuǎn)程倉庫打包的腳本,感覺不太完善,有些缺點(diǎn),最近抽空研究了下,做了些優(yōu)化。

1. 腳本優(yōu)化

截止到現(xiàn)在,打包并上傳到遠(yuǎn)程倉庫的腳本build_ios.sh長這樣:

echo "進(jìn)入到Flutter項(xiàng)目所在目錄"
projectURL=$(cd $(dirname $0); pwd)

#echo $projectURL

cd ${projectURL}

#獲取Flutter項(xiàng)目遠(yuǎn)程更新
git fetch
#拉取Flutter項(xiàng)目代碼
git pull
echo "拉取代碼結(jié)束"

# 讀取控制臺輸入要打包的環(huán)境
read -p "請輸入打包環(huán)境:1==Release, 0==Debug?  " configuration

echo "獲取的輸入結(jié)果: $configuration"

isRelease=true

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

echo "對比結(jié)果是 $isRelease"
# 相應(yīng)的環(huán)境
if [ $isRelease == true ]; then
    echo "選擇了Release"
    #路徑換成自己的生產(chǎn)pod對應(yīng)的路徑
    out='../iOSFlutterSDK/iOSFlutterSDK/ios_frameworks'
else
    echo "選擇了Debug"
    #路徑換成自己的測試pod對應(yīng)的路徑
    out='../iOSFlutterDevSDK/iOSFlutterDevSDK/ios_frameworks'
fi
#if [ -z $out ]; then
#    out='../iOSFlutterSDK/iOSFlutterSDK/ios_frameworks'
#fi

buildxc='buildxc'

echo "準(zhǔn)備輸出所有文件到目錄: $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包,因?yàn)閐ebug的包,在某些機(jī)型上不可用
    flutter build ios-framework --xcframework --no-release --no-debug --no-universal --output=$buildxc
fi

echo "編譯flutter完成,編譯所有文件到目錄: $buildxc"

# 創(chuàng)建導(dǎo)出包的文件夾
mkdir $out

if [ $isRelease == true ]; then
    # 拷貝Release編譯產(chǎn)物到指定目錄
    cp -r $buildxc/Release/*.xcframework $out
else
    # 拷貝Debug編譯產(chǎn)物到指定目錄
    cp -r $buildxc/Profile/*.xcframework $out
fi

echo "刪除編譯完成的臨時(shí)文件夾"
rm -rf $buildxc

read -p "是否需要推送到原生Pod倉庫 yes/no? " shouldPush
read -p "請輸入版本說明: " versionMsg

# 推送到遠(yuǎn)程,并打上tag
pushSpec(){
    if [ $isRelease == true ]; then
        # 拷貝Release編譯產(chǎn)物到指定目錄
        cd ../iOSFlutterSDK
    else
        # 拷貝Debug編譯產(chǎn)物到指定目錄
        cd ../iOSFlutterDevSDK
    fi
    
    echo "拉取遠(yuǎn)程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 "刪除最右邊.開始向及其左邊的數(shù)據(jù)"
    vs=${a##*.}
    # echo $vs
    oldNum=${vs%%\'*}
    # echo '當(dāng)前版本:'$oldNum
    newNum=$((oldNum+1))
    # echo '新版本:'$newNum

    # echo "替換版本號"
    v=0.1.$newNum
    version="  s.version          = '$v'"
    echo $version
    
    #區(qū)分Release和Debug兩種環(huán)境
    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推送到遠(yuǎn)程"
    git push
    git push --tags
}


if [ $shouldPush == "yes" ]; then
    echo "正在向遠(yuǎn)程倉庫推送"
    pushSpec
else
    echo "不向遠(yuǎn)程倉庫推送"
fi

# 以前的編譯導(dǎo)出的包
#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項(xiàng)目的路徑下,打包時(shí),將腳本文件直接拖入到終端,直接回車即可,按照控制臺的提示,輸入相應(yīng)的信息,就可以將pod倉庫推送到遠(yuǎn)程了。

3. 修改iOS原生項(xiàng)目中的Profile文件

Profile文件本身也是腳本文件,憑借我臨時(shí)抱佛腳的腳本功底,通過入?yún)⒌男问?,?code>Profile中的三方依賴,設(shè)置為可以根據(jù)環(huán)境(Debug或者Release)更替為相應(yīng)的SDK,同時(shí)支持三種環(huán)境集成:

  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環(huán)境的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'

#環(huán)境變量
#development_sdk 使用遠(yuǎn)程pod集成,flutter環(huán)境為Debug
#release_sdk 使用遠(yuǎn)程pod集成,flutter環(huán)境為Release
#local_flutter 使用本地Flutter環(huán)境集成,Debug、Release 開發(fā)者在scheme中自己選擇
case ENV['PODFILE_TYPE']
  when 'development_sdk'
  when 'release_sdk'
  else
  flutter_application_path = '這里是你的flutter_module對應(yīng)的路徑'
  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'
    # 測試環(huán)境
    pod 'iOSFlutterDevSDK', :git => 'https://codeup.aliyun.com/xxxx/iOSSDK/iOSFlutterDevSDK.git'
    when 'release_sdk'
    # 生產(chǎn)環(huán)境 Flutter SDK, 因?yàn)槲覀冏约旱膅itlab限制大文件傳輸,所以使用了其他
    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項(xiàng)目->General->參數(shù)化構(gòu)建中添加外化參數(shù)分別為:
use_remote_sdk:布爾值參數(shù),是否使用遠(yuǎn)程SDK集成
env_archive:選項(xiàng)參數(shù),Build環(huán)境,使用Release還是Debug(如果是使用本地flutter集成環(huán)境,則必須為Release)
flutter_branch:選項(xiàng)參數(shù),flutter項(xiàng)目其Git分支

在Jenkins項(xiàng)目->Build->添加一個執(zhí)行腳本,如下:

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 #進(jìn)入到flutter項(xiàng)目路徑
        # 此處應(yīng)該先校驗(yàn)一下分支名是否存在,但是我還沒找到合適的方法
        # 目前是每次有新分支了,先在打包機(jī)器上Flutter項(xiàng)目中,手動切出一個本地分支
        git pull origin $flutter_branch
        
        flutter pub get
        cd $projectURL
        pod install
fi

至此,腳本基本完成了,可以嘗試使用了,如有問題,歡迎批評指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容