Podfile 中 use_frameworks! 的作用

use_frameworks!生效的條件
1.use_frameworks!只有在第三方庫的podspec文件中沒有設置s.static_framework = true/falue時有效,如果第三方庫的podspec文件中設置了s.static_framework = true/false, 那麼依podspec中的設置爲準。
2.第三方庫必須是源代碼,否則也不生效。比如:原來是.a,.framework靜態庫,那麼不管Podfile中是否添加use_frameworks!都不會影響原來的結果。

所謂的庫就是一段編譯好的二進制文件+頭文件+相關的資源文件,然後提供給別人使用。
靜態庫(.a):在編譯時會將庫copy一份到目標程序中進行合併,編譯完成之後,目標程序不依賴外部的庫進行運行,缺點是會使應用程序變大
動態庫(.dylib):編譯時只存儲了指向動態庫的引用。可以多個程序指向這個庫,在運行時才加載然後動態鏈接,優點不會使體積變大。
Framework:實際上是一種打包方式,打出來的包可以是動態庫也可以是靜態庫。它是將庫的二進制文件,頭文件和有關的資源文件打包到一起,方便管理和分發。

對於CocoaPods管理的第三方庫是否使用的Framework,可以通過Podfile中的use_frameworks來控制
在Podfile中如果不加use_frameworks!,cocoapods會生成相應的 .a文件(靜態鏈接庫), Link Binary With Libraries: libPods-xxx.a 包含了其他用pod導入有第三庫的.a文件
使用了use_frameworks!,cocoapods會生成對應的frameworks文件(包含了頭文件,二進制文件,資源文件等等)Link Binary With Libraries:Pods_xxx.framework包含了其它用pod導入的第三方框架的.framework文件


iOS項目中use_frameworks!的使用場景
不使用frameworks的場景
1.純oc項目中 通過pod導入純oc項目

使用frameworks的場景
1.swift 項目中通過pod導入swift項目,必須要使用use_frameworks!,否則報錯,在需要使用的到地方 import AFNetworking

可加可不加的場景
1.swift 項目中通過pod導入OC項目
1)使用use_frameworks,在橋接文件里加上#import "AFNetworking/AFNetworking.h"
2)不使用frameworks,橋接文件加上 #import "AFNetworking.h"

use_frameworks!何時生效
use_frameworks!是否生效依賴於podspec指向的第三庫的實際情況。
use_frameworks!不生效場景
1.如果podspec指向的第三庫自己本身就是一個.a 靜態庫,或者.framework 靜態庫,
podfile是否使用use_framework
集成到主工程後,沒有區別,都是在app資源包下,與app主二進制可執行程序集合成一個整體執行文件

2, 如果組件庫是.framework 動態庫
那麼無論podfile是否使用use_framework都沒啥區別,都是在app資源包下面的framework目錄下。

3,podspec 既有靜態庫又有動態庫
靜態庫鏈接到可執行文件中去。動態庫在Frameworks下app啓動動態鏈接。

use_frameworks!生效場景
1,依賴的pod組件庫是源代碼
如果在podfile中使用了use_framework,會打成動態庫framework,放到app Frameworks目錄下。 app啓動時,動態鏈接。
如果是不用useframework,會編譯成.a,隨着編譯一起打進app二進制可執行程序內。

podspec中s.static_framework與Podfile中use_frameworks!的優先級
podspec static_framework 的優先級大於 Podfile中的use_framework! :linkage的優先級。
也就是說以podspec中的爲準。Podfile 只是改變,在podspec中沒有用static_framework指定的爲true或false情況下的集成方式。
如果podspec中源代碼的pod庫s.static_framework = true,則Podfile中用 use_frameworks! :linkage => :dynamic 也不會改變動態庫的方式。


當在podfile文件中使用use_frameworks!指令時,CocoaPod在安裝Pod時,會用framework方式組織資源(默認使用lib方式)
同時該指令還提供擴展選項,指定動態framework或者靜態framework
use_frameworks! #使用默認值,根據podspec 類型自行設置static或者dynamic
use_frameworks! :linkage => :static # 使用靜態鏈接
use_frameworks! :linkage => :dynamic #使用動態鏈接


當在podfile中設置了use_frameworks! ,但是沒有指定linkage => :static或linkage => :dynamic時,則會根據podspec文件中的根配置static_framework = true/false來設置。
和use_frameworks!的起作用條件一樣,即使在use_frameworks!後面加了linkage => :static或linkage => :dynamic,也只對源碼Pod有效,對已經是framework的pod不起作用。
注意:如果pod中的framework是動態庫,那麼在pod install後,會在相應的target的Build Phases設置中添加[cp] Embed Pods Frameworks腳本,以動態庫的方式將framework輸出到最終產物中。

如果在podspec中既有 靜態庫,又有動態庫:
s.dependency 'xxx' //是一個動態庫
s.dependency 'Bugly' //是靜態庫

 

那麼在Podfile中:
1、不使用:use_frameworks!
或者使用:
use_frameworks! :linkage => :static
按照靜態庫進行編譯,則可以編譯通過.

2、使用:use_frameworks!
或者
使用 use_frameworks! :linkage => :dynamic
進行動態庫進行編譯時,就會pod install報錯:



參考文章:
https://www.jianshu.com/p/8059330a61cd
https://juejin.cn/post/6974224632983322655
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章