iOS组件二进化之双源发布

4,117 阅读2分钟

obmNWRdp9l (1).jpg

一、背景

随着业务的扩展、项目体积的增大,CocoaPods组件库越来越多,每次重新编译的时候速度越来越慢,这给我们提出了需要提高编译速度的需求。二进化方案很多,本次主要讲同时发布源码库和二进化库入门。

二、具体实现步骤

第一步:

创建pod 工程

    pod lib create GGZBUsinessKit

第二步:

创新新的scheme,这一步很重要,用于后续xcodebuild打包

Xnip2022-10-28_17-02-51.jpg

Xnip2022-10-28_17-04-22.jpg

第三步

将新的scheme设置static framwork格式

Xnip2022-10-29_17-05-52.jpg

第四步:

在GGZBUsinessKit的Development Pods目录下创建测试文件

Xnip2022-10-28_16-55-37.jpg GGZBUsinessKit.h是二进制公开头文件 GGZTest类是测试文件 注意:需要把需要外部引用的文件加入public header ,打framework静态库才会拷贝到headers目录下

Xnip2022-10-28_16-59-27.jpg

第五步:

新建GGZBUsinessKit-binary.podspec二进制对应的podspec文件,执行framework的路径,核心信息如下,详细信息看我下面的github里信息即可。

    s.ios.vendored_frameworks = 'GGZBUsinessKit/Frameworks/GGZBUsinessKit.framework'

第六步:

脚本编译本地的静态库二进制


# 编译
function** build_framework {
    echo "======build_framework start======"
    #若支持bitCode,需加参数:-fembed-bitcode
    xcodebuild -workspace ${workspace}.xcworkspace -scheme ${scheme} -sdk iphoneos -configuration "Release" OTHER_CFLAGS="-fembed-bitcode" BUILD_DIR="../${build_dir}" build || exit 1    
    xcodebuild -workspace ${workspace}.xcworkspace -scheme ${scheme} -sdk iphonesimulator -configuration "Release" ONLY_ACTIVE_ARCH=NO EXCLUDED_ARCHS="arm64" OTHER_CFLAGS="-fembed-bitcode" BUILD_DIR="../${build_dir}" build || exit 1
    
    #删除模拟器arm64架构(第二种方式)
    #cd /Users/gegaozhao/Desktop/person/工程化1/GGZBUsinessKit/Example/build/Release-iphonesimulator/GGZBUsinessKit/GGZBUsinessKit.framework
    #lipo -remove arm64 ${framework_name} -o ${framework_name}
    #cd ../../../../
    #CURRENT_DIR=$(cd $(dirname $0); pwd)
    
    echo "======build_framework end======"
}

# 合并
function** build_fat_framework {
    echo "======build_fat_framework start======"    
    mkdir -p ${out_dir}/
    cp -R ${build_dir}/Release-iphoneos/${framework_name}/${framework_name}.framework ${out_dir}
    lipo -create ${build_dir}/Release-iphonesimulator/${framework_name}/${framework_name}.framework/${framework_name} ${build_dir}/Release-iphoneos/${framework_name}/${framework_name}.framework/${framework_name} -output ${out_dir}/${framework_name}.framework/${framework_name} || exit 1
    echo "======build_fat_framework end======"
}

# 将最终的二进制库转移到最终目录下
function** store_final_framework {
    echo "======build final framework start======"
    if [ -d ${final_framework_dir} ];**then**
        echo "删除 ${final_framework_dir}"
        rm -R ${final_framework_dir}
    fi

    echo "创建 ${final_framework_dir}"
    mkdir ${final_framework_dir}

    cp -R ${out_dir}/${framework_name}.framework ${final_framework_dir}
    
    echo "======build final framework end======"
}

注意:iOS10之后模拟器会包含arm64架构,合并生成fat库会提示模拟器架构和真机架构冲突,这里需要模拟器二进制库的arm64架构剔除下!

第七步:

发布二进制库和源码脚本

# 配置podspec版本号
function podspec_verion_config {
    echo "======build_config start======"
    old_build_version=`grep -E 's.version.*=' ../GGZBUsinessKit.podspec | tr -d "'a-z= " | sed "s/\.//1"`
    increment_version $old_build_version
    replae_podspec_version
    echo "======build_config end======"
}

#最后一个数字+1
function increment_version {
    declare -a part=( ${1//\./ } )
    declare new
    declare -i carry=1
    CNTR=${#part[@]}-1
    len=${#part[CNTR]}
    new=$((part[CNTR]+carry))
    part[CNTR]=${new}
    build_version="${part[*]}"
    echo "new version is: ${build_version// /.}"
}

#详细看github里详细代码
function replae_podspec_version {
    echo "最新版本:${build_version// /.}"
    new="${build_version// /.}"
    python3 ../increase_version_podspec.py "../${pod_source_name}.podspec" "${new}"
    python3 ../increase_version_podspec.py "../${pod_binary_name}.podspec" "${new}"
}

# 检测是否需要提交信息 && 有的话就进行提交远程仓库 && 打tag提交到远程
function detect_code_commit {
    echo "======detect_code_commit start======"
    git add ../
    git commit -m '提交静态库和更新后的代码逻辑'
    git push --**set**-upstream origin
    echo "======detect_code_commit start======"
}

# 打tag
function push_new_tag {
    echo "======add_new_tag start======"
    git tag "${build_version// /.}"
    git push origin --tags
    echo "======add_new_tag end  ======"
}

# pod发布
function** pod_release_publish {
    cd ../
    echo "======pod source publish start======"
    pod repo push GGZSpec ${pod_source_name}.podspec --use-libraries --allow-warnings --skip-import-validation --skip-tests --verbose
    echo "======pod source publish end======"    

    echo "======pod binary publish start======"
    pod repo push GGZSpec ${pod_binary_name}.podspec --use-libraries --allow-warnings --skip-import-validation --skip-tests --verbose
    echo "======pod binary publish end======"
}

这里先去提交修改信息,打tag,然后发布二进制库和源码库

三、其他

代码详细信息:github.com/GE-GAO-ZHAO…

四、后语

二进化方案这里采用双源模式,使用xcodebuild打的静态库,还有其他方式如ruby环境变量和官方cocoapods插件实现二进库打包等方式很多,可以参考我的上一篇文档。

回顾2022,展望2023,我正在参与2022年终总结征文大赛活动