美文网首页js css html
脚本导出framework

脚本导出framework

作者: 独孤流 | 来源:发表于2022-04-25 15:42 被阅读0次

    参考:
    统计Shell脚本执行时间
    xcodebuild命令简单使用
    一键打包完整Shell脚本xcodebuild archive
    How to create XCFramework?
    找出 XCode 所有内置的环境变量 - SourceKim’s Blog

    Mac shell 输出日志到文件
    XCode执行脚本的三种方式
    CocoaPods 静态库 pod lib lint app normal arm64
    创建多层文件夹:mkdir -p xx/xx/xx
    设置可执行权限:chmod +x xxx.sh
    完整demo:https://github.com/eye1234456/MyTestLibs.git

    如果遇到用脚本build时某个三方库报 xxx/Objects-normal/arm64/Binary
    可以fork下该三方库,然后在podspec中添加

    s.pod_target_xcconfig = {
            'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64'
        }
    s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
    

    一、使用archive的方式导出xcframework

    完整参考例子:https://github.com/eye1234456/MyTestLibs/blob/main/HelloSDK/xcframework_archive_auto.sh

    #!/bin/bash
    # set framework folder name
    # 工程名称(Project的名字)
    PROJECT_NAME="HelloSDK"
    # scheme名称
    # SCHEME_NAME="HelloSDK"
    SCHEME_NAME="AAASDK"
    Configuration="Debug"
    # 项目所在的文件
    PROJECT_DIR=`pwd`
    
    
    XCWORKSPACE="${PROJECT_NAME}.xcworkspace"
    FRAMEWORK_FOLDER_NAME="${PROJECT_NAME}_${SCHEME_NAME}_XCFramework"
    TEMP_FRAMEWORK_DIR="${PROJECT_DIR}/${FRAMEWORK_FOLDER_NAME}"
    # set framework name or read it from project by this variable
    
    #xcframework path
    # 生成的xcframework
    EXPORT_FOLDER_PATH="${HOME}/Desktop/${FRAMEWORK_FOLDER_NAME}"
    # 生成xcframework的路劲
    EXPORT_XCFRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.xcframework"
    # 生成真机、模拟器二和一的路劲
    EXPORT_MIX_FRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.framework"
    # set path for iOS simulator archive
    # 生成的模拟器的库的文件
    SIMULATOR_ARCHIVE_PATH="${TEMP_FRAMEWORK_DIR}/simulator.xcarchive"
    # set path for iOS device archive
    # 生成的真机的库的文件
    IOS_DEVICE_ARCHIVE_PATH="${TEMP_FRAMEWORK_DIR}/iOS.xcarchive"
    # 删除之前生成的xcframework的文件夹
    rm -rf "${EXPORT_FOLDER_PATH}"
    echo "Deleted ${FRAMEWORK_FOLDER_NAME}"
    mkdir -p "${FRAMEWORK_FOLDER_NAME}"
    echo "Created ${FRAMEWORK_FOLDER_NAME}"
    echo "Archiving ${SCHEME_NAME}"
    
    echo '==================start================'
    total_startTime_s=`date +%s`
    
    #更新pod配置
    
    echo '开始install Pod'
    pod_startTime_s=`date +%s`
    pod install
    pod_endTime_s=`date +%s`
    echo '结束install Pod'
    echo "install pod 时长:$[$pod_endTime_s - $pod_startTime_s]"
    
    echo '开始模拟器archive'
    archive_simulator_startTime_s=`date +%s`
        
    # 创建simulator的framework
    xcodebuild archive \
    -workspace ${XCWORKSPACE} \
    -scheme ${SCHEME_NAME} \
    -configuration ${Configuration} \
    -destination="iOS Simulator" \
    -archivePath "${SIMULATOR_ARCHIVE_PATH}" \
    -sdk iphonesimulator clean build \
    SKIP_INSTALL=NO \
    BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    archive_simulator_endTime_s=`date +%s`
    echo "模拟器archive时长:$[$archive_simulator_endTime_s - $archive_simulator_startTime_s]"
    echo '结束模拟器archive'
    
    echo '开始真机archive'
    archive_iphone_startTime_s=`date +%s`
    # 创建iPhone的framework
    xcodebuild archive \
    -workspace ${XCWORKSPACE} \
    -scheme ${SCHEME_NAME} \
    -configuration ${Configuration} \
    -destination="iOS" \
    -archivePath "${IOS_DEVICE_ARCHIVE_PATH}" \
    -sdk iphoneos clean build \
    SKIP_INSTALL=NO \
    BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    archive_iphone_endTime_s=`date +%s`
    echo "真机archive时长:$[$archive_iphone_endTime_s - $archive_iphone_startTime_s]"
    echo '结束真机archive'
    
    #Creating XCFramework
    # 创建的模拟器库的地址
    SIMULATOR_Framework_PATH="${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${SCHEME_NAME}.framework"
    # 创建的真机的库的地址
    IPHONE_Framework_PATH="${IOS_DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${SCHEME_NAME}.framework"
    
    
    # 生成xcframework
    echo '开始合成xcframework'
    create_xcframework_startTime_s=`date +%s`
    
    xcodebuild -create-xcframework \
    -framework ${SIMULATOR_Framework_PATH} \
    -framework ${IPHONE_Framework_PATH} \
    -output "${EXPORT_XCFRAMEWORK_PATH}"
    
    create_xcframework_endTime_s=`date +%s`
    echo "合成xcframework时长:$[$create_xcframework_endTime_s - $create_xcframework_startTime_s]"
    echo '结束合成xcframework'
    
    # 生成真机模拟器二合一framework
    echo '开始合成framework'
    create_mix_framework_startTime_s=`date +%s`
    
    # 先复制一个真机的版本到目标
    cp -rf ${IPHONE_Framework_PATH} ${EXPORT_MIX_FRAMEWORK_PATH}
    # 将真机和模拟器合并成一个
    lipo -create \
    "${SIMULATOR_Framework_PATH}/${SCHEME_NAME}" \
    "${IPHONE_Framework_PATH}/${SCHEME_NAME}" \
    -output "${EXPORT_MIX_FRAMEWORK_PATH}/${SCHEME_NAME}"
    
    create_mix_framework_endTime_s=`date +%s`
    echo "合成framework时长:$[$create_mix_framework_endTime_s - $create_mix_framework_startTime_s]"
    echo '结束合成framework'
    
    rm -rf "${TEMP_FRAMEWORK_DIR}"
    total_endTime_s=`date +%s`
    echo '==================end================'
    echo "总共时长:$[$total_endTime_s - $total_startTime_s]"
    
    open "${EXPORT_FOLDER_PATH}"
    
    

    二、在xcode里创建一个专门用于生成xcframework的target

    这种方式可以使用build模拟器的方式就生成xcframework,主要使用在直接使用shell命令进行archive或build会失败,但是在xcode里能build成功的场景,优势是配置好后全程在xcode里操作,劣势是操作步骤比较多,需要三次点击build

    1、创建一个的target,Other->Aggregate,专门用于build,并在新target的Build Phases里新增一个Run Script,内容如下:

    #!/bin/bash
    # set framework folder name
    # 工程名称(Project的名字)
    PROJECT_NAME="XXX"
    # scheme名称
    SCHEME_NAME="XXX"
    Configuration="Debug"
    # 编译文件的位置
    Products_Path="${SYMROOT}"
    
    FRAMEWORK_FOLDER_NAME="${PROJECT_NAME}_${SCHEME_NAME}_XCFramework"
    # set framework name or read it from project by this variable
    
    #xcframework path
    # 生成的xcframework
    EXPORT_FOLDER_PATH="${HOME}/Desktop/${FRAMEWORK_FOLDER_NAME}"
    # 生成xcframework的路劲
    EXPORT_XCFRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.xcframework"
    # 生成真机、模拟器二和一的路劲
    EXPORT_MIX_FRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.framework"
    # set path for iOS simulator archive
    # 删除之前生成的xcframework的文件夹
    rm -rf "${EXPORT_FOLDER_PATH}"
    echo "Deleted ${FRAMEWORK_FOLDER_NAME}"
    mkdir -p "${FRAMEWORK_FOLDER_NAME}"
    echo "Created ${FRAMEWORK_FOLDER_NAME}"
    
    echo '==================start================'
    total_startTime_s=`date +%s`
    
    
    #Creating XCFramework
    # 创建的模拟器库的地址
    SIMULATOR_Framework_PATH="${Products_Path}/${Configuration}-iphonesimulator/${SCHEME_NAME}.framework"
    # 创建的真机的库的地址
    IPHONE_Framework_PATH="${Products_Path}/${Configuration}-iphoneos/${SCHEME_NAME}.framework"
    
    
    # 生成xcframework
    echo '开始合成xcframework'
    create_xcframework_startTime_s=`date +%s`
    
    xcodebuild -create-xcframework \
    -framework ${SIMULATOR_Framework_PATH} \
    -framework ${IPHONE_Framework_PATH} \
    -output "${EXPORT_XCFRAMEWORK_PATH}"
    
    create_xcframework_endTime_s=`date +%s`
    echo "合成xcframework时长:$[$create_xcframework_endTime_s - $create_xcframework_startTime_s]"
    echo '结束合成xcframework'
    
    # 生成真机模拟器二合一framework
    echo '开始合成framework'
    create_mix_framework_startTime_s=`date +%s`
    
    # 先复制一个真机的版本到目标
    cp -rf ${IPHONE_Framework_PATH} ${EXPORT_MIX_FRAMEWORK_PATH}
    # 将真机和模拟器合并成一个
    lipo -create \
    "${SIMULATOR_Framework_PATH}/${SCHEME_NAME}" \
    "${IPHONE_Framework_PATH}/${SCHEME_NAME}" \
    -output "${EXPORT_MIX_FRAMEWORK_PATH}/${SCHEME_NAME}"
    
    create_mix_framework_endTime_s=`date +%s`
    echo "合成framework时长:$[$create_mix_framework_endTime_s - $create_mix_framework_startTime_s]"
    echo '结束合成framework'
    
    rm -rf "${TEMP_FRAMEWORK_DIR}"
    total_endTime_s=`date +%s`
    echo '==================end================'
    echo "总共时长:$[$total_endTime_s - $total_startTime_s]"
    
    open "${EXPORT_FOLDER_PATH}"
    

    2、对要导出的scheme的真机版本进行build
    3、对要导出的scheme的模拟器版本进行build
    4、对专门用于导出export的scheme进行build


    三、使用build的方式导出xcframework

    #!/bin/bash
    # set framework folder name
    # 工程名称(Project的名字)
    PROJECT_NAME="woxiu"
    # scheme名称
    SCHEME_NAME="WXSDK"
    # 模式
    Configuration="Debug"
    Configuration="Release"
    pwdPath=`pwd`
    
    
    XCWORKSPACE="${PROJECT_NAME}.xcworkspace"
    FRAMEWORK_FOLDER_NAME="${PROJECT_NAME}_${SCHEME_NAME}_XCFramework"
    # 编译文件的位置
    TEMP_Products_Path="${pwdPath}/${FRAMEWORK_FOLDER_NAME}"
    # set framework name or read it from project by this variable
    
    #xcframework path
    # 生成的xcframework
    EXPORT_FOLDER_PATH="${HOME}/Desktop/${FRAMEWORK_FOLDER_NAME}"
    EXPORT_FRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.xcframework"
    # 删除之前生成的buidle的文件夹
    rm -rf "${TEMP_Products_Path}"
    echo "Deleted ${TEMP_Products_Path}"
    mkdir -p "${TEMP_Products_Path}"
    # 删除之前生成的xcframework的文件夹
    rm -rf "${EXPORT_FOLDER_PATH}"
    mkdir -p "${EXPORT_FOLDER_PATH}"
    echo '==================start================'
    total_startTime_s=`date +%s`
    
    #更新pod配置
    
    echo '开始install Pod'
    pod_startTime_s=`date +%s`
    pod install
    pod_endTime_s=`date +%s`
    echo '结束install Pod'
    echo "install pod 时长:$[$pod_endTime_s - $pod_startTime_s]"
    
    
    #echo '开始编译Pods'
    #build_startTime_s=`date +%s`
    #xcodebuild -project Pods/Pods.xcodeproj build
    #build_endTime_s=`date +%s`
    #echo '结束编译Pods'
    #echo "Pod编译时长:$[$build_endTime_s - $build_startTime_s]"
    
    xcodebuild build \
    -workspace ${XCWORKSPACE} \
    -scheme ${SCHEME_NAME} \
    -configuration ${Configuration} \
    -sdk iphonesimulator \
    SYMROOT=${TEMP_Products_Path}
    
    xcodebuild build \
    -workspace ${XCWORKSPACE} \
    -scheme ${SCHEME_NAME} \
    -configuration ${Configuration} \
    -sdk iphoneos \
    SYMROOT=${TEMP_Products_Path}
    
    #Creating XCFramework
    # 创建的模拟器库的地址
    SIMULATOR_Framework_PATH="${TEMP_Products_Path}/${Configuration}-iphonesimulator/${SCHEME_NAME}.framework"
    # 创建的真机的库的地址
    IPHONE_Framework_PATH="${TEMP_Products_Path}/${Configuration}-iphoneos/${SCHEME_NAME}.framework"
    
    # 生成xcframework
    xcodebuild -create-xcframework \
    -framework ${SIMULATOR_Framework_PATH} \
    -framework ${IPHONE_Framework_PATH} \
    -output "${EXPORT_FRAMEWORK_PATH}"
    
    
    rm -rf ${TEMP_Products_Path}
    rmdir ${TEMP_Products_Path}
    total_endTime_s=`date +%s`
    echo '==================end================'
    echo "总共时长:$[$total_endTime_s - $total_startTime_s]"
    
    open "${EXPORT_FOLDER_PATH}"
    
    

    四、使用手动build,然后自动生成xcframework的方式

    1、在对应target的Build Phases里增加打印编译地址的Run Script

    # 将编译生成物的地址,写到项目文件地址上  
    echo "${SYMROOT}" > "${SRCROOT}/SYMROOT_log.txt"
    

    2、手动在xcode里对模拟器+真机执行build
    3、使用编译物生成xcframework

    #!/bin/bash
    # set framework folder name
    # scheme名称
    SCHEME_NAME="xxx"
    # 模式
    Configuration="Debug"
    # 编译文件的位置
    Products_Path=`cat SYMROOT_log.txt`
    
    
    FRAMEWORK_FOLDER_NAME="${SCHEME_NAME}_XCFramework"
    # set framework name or read it from project by this variable
    
    #xcframework path
    # 生成的xcframework
    EXPORT_FOLDER_PATH="${HOME}/Desktop/${FRAMEWORK_FOLDER_NAME}"
    EXPORT_FRAMEWORK_PATH="${EXPORT_FOLDER_PATH}/${SCHEME_NAME}.xcframework"
    # 删除之前生成的xcframework的文件夹
    rm -rf "${EXPORT_FOLDER_PATH}"
    echo '==================start================'
    total_startTime_s=`date +%s`
    
    #Creating XCFramework
    # 创建的模拟器库的地址
    SIMULATOR_Framework_PATH="${Products_Path}/${Configuration}-iphonesimulator/${SCHEME_NAME}.framework"
    # 创建的真机的库的地址
    IPHONE_Framework_PATH="${Products_Path}/${Configuration}-iphoneos/${SCHEME_NAME}.framework"
    
    # 生成xcframework
    xcodebuild -create-xcframework \
    -framework ${SIMULATOR_Framework_PATH} \
    -framework ${IPHONE_Framework_PATH} \
    -output "${EXPORT_FRAMEWORK_PATH}"
    
    total_endTime_s=`date +%s`
    echo '==================end================'
    echo "总共时长:$[$total_endTime_s - $total_startTime_s]"
    
    open "${EXPORT_FOLDER_PATH}"
    
    

    0、要设置导出的版本,在sdk的Build Settings里设置固定的支持的架构即可

    image.png

    1、当运行模拟器时,选择debug模式,导出的framework集成后能正常运行

    2、当运行模拟器时,选择Release模式,就会报如下的错误:
    Building for iOS Simulator, but linking in dylib built for iOS, file '/xxxx/xxxx.framework/xxx' for architecture arm64

    解决方案:在集成的主APP里,Build Settings->Architechures->Excluded Architechures->Release
    新增:Any iOS Simulator SDK -> arm64 如图

    image.png

    相关文章

      网友评论

        本文标题:脚本导出framework

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