如何快速用上Swift靜態庫詳解

2022-09-20 21:24:10 字數 2802 閱讀 6016

前言

swift 支援靜態庫打包已經有一段時間了,cocoapods 也提供了 static_framework 引數。然而大部分的第三方依賴都沒有及時更新。

本文給出個相對方便一些的方案用上靜態庫,個人感覺在依賴不那麼複雜的時候成本還是比較低的。

效果如下:

示例位址:usestaticframework

想辦法為每乙個 pod 新增程式設計客棧 static_framework 是關鍵。

直接修改 podspec 不太現實,因為 cocoapods 並沒有提供相關的介面。但是當乙個 pod 指定 podspec 位址時,這個 podspec 會被儲存在本地。

如果 pod 沒有更新,pod install 將直接從本地獲取 pod 資訊,這就為我們修改 pod 提供了可能。

target 'usestaticframework' do

pod 'rxswift', :git => ''

endpre_install do |installer|

installer.sandbox.specifications_root.children.each do |podspec|

if podspec.extname() == '.json'

edit_pod_spec podspec

endend

enddef edit_uwgfhpod_spec(fwww.cppcns.comile)

code = file.read(file)

json = json.parse(code)

json['static_framework'] = true

file.write(file, json.generate(json))

end在 podfile 中新增以上**,執行兩次 bundle exec pod install 即可將依賴 rxswift 變成靜態庫。相比單獨建乙個 specs 方便很多了,特別是在 rxswift 有更新時,我們也無需增加成本,執行 bundle exec pod update 即可。

有些依賴稍微麻煩些,比如 rxcocoa 。就目前來看,swift 靜態庫似乎還不能混編,好在 rxcocoa 支援 spm,在 spm 中有乙個 rxcocoaruntime 依賴。

建立乙個 rxcocoaruntime.podspec 使用,再調整一下 rxcocoa 的 podspec 即可,注意新增 swift_package 編譯標記:

pod 'rxcocoa', :git => ''

pod 'rxcocoaruntime', :podspec => ''

def edit_pwww.cppcns.comod_spec(file)

code = file.read(file)

json = json.parse(code)

json['static_framework'] = true

if json['name'] == 'rxcocoa'

json['xcconfig'] =

json['source_files'] = ['rxcocoa/rxcocoa.swift', 'rxcocoa/common/**/*.', 'rxcocoa/traits/**/*.', 'rxcocoa/foundation/**/*.', 'rxcocoa/runtime/**/*.', 'platfor']

json['preserve_paths'] = ['rxcocoa/rxcocoa.h', 'rxcocoa/*.swift', 'rxcocoa/common/**/*.', 'rxcocoa/traits/**/*.', 'rxcocoa/foundation/**/*.', 'rxcocoa/runtime/**/*.', 'platform/**/*.swift']

json['dependencies'] =

endfile.write(file, json.generate(json))

end執行兩次bundle exec pod install,完成。

apollo 這種也能搞,稍微麻煩一些,有些**沒有引入 uikit,最終導致按照上面的方案編譯不過去。

pod 'sqlite.swift', :git => ''

pod 'sqliteobjc', :podspec => ''

pod 'apollo', :git => ''

pod 'apollo/sqlite', :git => ''

# edit_pod_spec

if json['name'] == 'sqlite.swift'

json['xcconfig'] =

json['dependencies'] =

json['subspecs'] = [/**/*.',

:exclude_files => 'sources/**/cipher.swift',

:library => 'sqlite3'

}]end

post_install do |installer|

%w(pods/apollo/sources/apollosqlite/*.swift).flat_map .each do |file|

code = file.read(file)

unless code.include? "import uikit"

fileutils.chmod("+w", file)

file.write(file, "import uikit\n" + code)

endend

end給這些沒新增 import uikit **補上就行了。

總結本文標題: 如何快速用上swift靜態庫詳解

本文位址:

如何編寫靜態庫

1.使用vs2013建立普通的應用臺控制程式 2.在屬性裡選擇靜態庫 lib 編寫庫檔案 mylib.h pragam once int sum int a,int b include mylib.h 函式實現 int sum int a,int b 3.編譯,成功後會在目錄下生成.lib檔案4.使...

如何生成靜態庫和動態庫

對於乙個編譯型語言,編譯器工作時總要經過預處理 編譯 鏈結等幾個過程。以 c c 為例 預處理器 cpp 將每個 c cpp 檔案中 include 的標頭檔案都合併到 c cpp 檔案中,並且對其進行巨集擴充套件,由此生成數個編譯單元。一般來說每個 c cpp 檔案對應乙個編譯單元。隨後,編譯器 ...

如何生成靜態庫和動態庫

對於乙個編譯型語言,編譯器工作時總要經過預處理 編譯 鏈結等幾個過程。以 c c 為例 預處理器 cpp 將每個 c cpp 檔案中 include 的標頭檔案都合併到 c cpp 檔案中,並且對其進行巨集擴充套件,由此生成數個編譯單元。一般來說每個 c cpp 檔案對應乙個編譯單元。隨後,編譯器 ...