美文网首页
Cocoapods实现私有库开发和二进制发布

Cocoapods实现私有库开发和二进制发布

作者: 路漫漫其修远兮Wzt | 来源:发表于2022-10-09 20:04 被阅读0次

本文转载自: David'Blog Cocoapods实现私有库开发和二进制发布,如有侵权请联系删除

近期接到了个需求,要实现一个组件项目在开发时候实现自动输出Framework。即这个项目实际上是一个基于Podspec的组件私有库,开发的时候只有部分同学可以访问私有库的源码,而最后以Framework的形式输出给其他人。

这是Demo传送链接

image.png

Cocoapods注入脚本

为了实现以上的需求,最先想到的就是希望在每次构建结束后利用脚本来自动化这个功能。经过一番查询,在Cococapods中发现果然可以实现脚本注入。

根据这篇文章在1.4.0之后支持podfile和podspec注入脚本到xcode中对应的工程target中。即在podfile中的脚本会注入到Demo.xcodeproj而podspec中的脚本注入到Pods.xcodeproj中的target。

利用cocopods提供的脚本注入语法,注入的脚本的执行时机是在该target进行编译前/中/后。

显然根据需求我们是在制作一个podspec组件,所以我们将要注入Framework制作脚本到Demo.xcodeproj中触发脚本到Pods.xcodeproj制作一个Framework。因为我们要制作的framework本身就是Pods.xcodeproj中的target,假如把脚本注入到Pods.xcodeproj这个工程中则会引起脚本循环执行。

Framework制作脚本

接下来我们制作Framework的脚本有以下三种方案:

  • Carthage Build,需要将target scheme改为shared才能构建,只支持dynamic的Framwork且没有支持mangle技术。
  • Cocoapods-packager支持dynamic和static的Framework,并且支持mangle技术可以修改符号表防止方法名冲突,但动态库打包目前只支持到pod 1.5.3版本,引入Swift代码会有问题,长期缺少维护。
  • 自制xcodebuild脚本,实际上上面两种第三方方案原理上也是调用xcodebuild来进行打包的所以我们同样可以自定义一个xcodebuild脚本来更自由实现打包工作。

在实践的时候发现还是用自制xcodebuild shell脚本最为简单,Carthage由于需要手动将target scheme设为shared导致无法实现脚本打包,Cocoapods-packager需要先上传代码到远程仓库上。

具体过程可以参考Demo

最后实现在每次构建结束后生成一个Framework,最后将这个Framework输出到最终发布仓库下实现整个开发发布流程。如下图我们实现两个仓库:

  • 私有组件仓库Binarization
  • 二进制发布公开仓库Binarization_Public


    image.png
image.png

参考

基于 CocoaPods 进行 iOS 开发
一行命令发布 Pod 框架
谈谈CocoaPods组件二进制化方案
iOS脚本打包

工程上的二三事

xcbuild_pack.sh

#!/bin/sh

TARGET="BluetoothSDK"

#如果有输入参数则用输入参数
if [[ $1 ]]
then
TARGET=$1
fi

#定义一下用到的变量,接下去不使用外部环境变量
OUTPUT_FLODER="${PROJECT_DIR}/../ReleaseFameworks"
PROJECT="${PODS_ROOT}/Pods.xcodeproj"
BUILD_DIR="${BUILD_DIR}"
BUILD_ROOT="${BUILD_ROOT}"
CONFIGURATION="Release"
BUILD_IPHONEOS_FRAMEWORK_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET}/${TARGET}.framework" 
BUILD_IPHONESIMULATOR_FRAMEWORK_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET}/${TARGET}.framework"

#创建输出目录,并删除之前的framework文件
mkdir -p "${OUTPUT_FLODER}"
rm -rf "${OUTPUT_FLODER}/${TARGET}.framework"

#分别编译模拟器和真机的Framework,同时不使用new build system
xcodebuild -project ${PROJECT} -target "${TARGET}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build -UseModernBuildSystem=NO
xcodebuild -project ${PROJECT} -target "${TARGET}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build -UseModernBuildSystem=NO

#拷贝framework到输出目录上
cp -R ${BUILD_IPHONEOS_FRAMEWORK_PATH} ${OUTPUT_FLODER}

#合并framework,输出最终的framework到build目录
lipo -create -output "${OUTPUT_FLODER}/${TARGET}.framework/${TARGET}" "${BUILD_IPHONESIMULATOR_FRAMEWORK_PATH}/${TARGET}" "${BUILD_IPHONEOS_FRAMEWORK_PATH}/${TARGET}"

#删除编译之后生成的无关的配置文件
dir_path="${OUTPUT_FLODER}/${TARGET}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done

#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"

相关文章

  • Cocoapods实现私有库开发和二进制发布

    本文转载自: David'Blog[https://hello-david.github.io/] Cocoapo...

  • 制作CocoaPods

    iOS管理第三方库大多使用CocoaPods,如果需要实现组件化或者发布自己的开源库/私有库到CocoaPods,...

  • 组件化开发(四)本地私有库

    通过本地私有库实现组件化开发 组件化开发分为本地私有库和远程私有库,这里我们先来学习如何通过本地私有库实现组件化的...

  • iOS 创建CocoaPods私有库

    一、简介 为了实现组件化开发,方便每个模块到开发和版本控制,为每个组件创建CocoaPods私有库是目前最有效的方...

  • pod私有库

    接着上两篇文章CocoaPods公有库和CocoaPods本地私有库,这篇就来讲解下CocoaPods远程私有库,...

  • CocoaPods使用总结

    CocoaPods 公共库的创建CocoaPods 本地私有库的创建(模板创建方式)CocoaPods 本地私有库...

  • 发布CocoaPods私有库

    1 、去码云或者Coding上新建两个仓库2、一个是存放我们的代码仓库,另一个是cocoapods存放代码的描述文...

  • cocoapods私有库的创建和使用

    使用cocoapods私有库能够更好的帮助我们实现组件化开发,大体分为五部分+坑? 官网链接 1.私有仓库pod ...

  • CocoaPods私有库搭建说明

    CocoaPods私有库搭建说明 关于CocoaPods CocoaPods是Swift和Objective-C ...

  • 使用Cocoapods创建私有podspec

    参考文章: CocoaPods私有库配置笔记 使用Cocoapods创建私有podspec cocoapods应用...

网友评论

      本文标题:Cocoapods实现私有库开发和二进制发布

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