场景

我们的sdk中因为要与其他母项目共用一些库,所以要使用动态库,因此在我们的podfile中配置了use_framework!,但是我们只是一部分库共用,还有一些库不是共用的,但是这样的配置会导致所有的库都变成了动态库,每次我们pod install之后都需要手动去更改,把非共用库改为静态库。这样就非常耗费时间,同时也容易出错。

那有没有一种办法可以使动态库静态库直接通过配置完成呢?

解决

经过搜索,发现其实是有这样的操作的,就是s.static_framework = true,但是这个属性要cocoapods1.4.0之后才支持。

思路大概有了,步骤就是
1.更新cocoapods
2.在要使用静态库的配置文件中添加s.static_framework = true

在做第二步的时候又发现了一个问题,就是我把这个配置修改了之后其他人使用这个库的时候也只能是静态库了。所以我不能直接修改远程文件配置,那只能修改本地的了,这样每次执行pod update之后都需要通过脚本去修改一下文件配置,实现是能实现,但是感觉上会有点low,所以找下看有没有更智能的办法。直接通过在podfile中代码配置进行指定库的修改。

经过一番查找,通过对几篇文章的综合整理,整理出了下面的方法:

#以下这些都是ruby语法

#创建需要进行处理的动态库的数组
needStaticAry = Array['AESCrypt-ObjC-framework', 'FBAllocationTracker-framework', 'FBMemoryProfiler-framework', 'FBRetainCycleDetector-framework', 'FLEX-framework', 'IFHXGridTableView-framework', 'MBSwitch-framework', 'MJExtension-framework', 'OpenUDID-framework', 'PopupManager-framework', 'Reachability-framework', 'UMSAgent-framework']
#这个hooks允许,你在生成xcode project写入硬盘前做最后的改动
post_install do |installer|
    #获取所有的target,包括静态库h和动态库
    installer.pods_project.targets.each do |target|
        #打印所有的target,这里的target是一个对象,获取名字需要用target.name
        #puts "  ||-#{target}"

        needStaticAry.each do |staticTarget|
            if target.name == staticTarget
                target.build_configurations.each do |config|
                    #将mach-o改为静态库
                    config.build_settings['MACH_O_TYPE'] = "staticlib"

                end
            end
        end
    end
end



参考

以下内容是针对配置方面进行搜索:
cocoapods的静态库和动态库
CocoaPods 动/静态库混用封装组件化
Pods的static_framework使用感受 2

以下内容是直接操作podfile进行搜索:
把玩CocoaPods post_install 和 pre_install
升级 CocoaPods 1.5,使用 Swift Static Library
undefined method native_target during post install
你真的会写Podfile吗?