最開始是想默默寫一個庫依賴管理工具的,由於這牽涉到的知識點不少,想經過本身寫來學習,寫了一部分的時候想要不要寫成系列文章呢?由於一來能夠督促本身寫完,二來你們在看的時候也能提供到幫助,由於我的還有不少知識點的欠缺,直到開始寫這篇文章我還有不少細節沒肯定,三來其餘同窗在看到的時候或多或少能學習到一點東西。當開始寫的仍是坐臥不安的,怕本身hold不住,也怕太監最後寫不完😂,只能說在能力所及內盡力寫完,在寫的過程當中有錯誤也歡迎你們提出來。linux
你們都知道目前可用的庫依賴管理工具備swift-package-manager,Cocoadods和Carthage,這三個庫剛好我都用過,swift-package-manager和Carthage的源碼也都看過,先來簡單分析分析他們的區別。git
swift-package-manager
- Apple官方提供的軟件包管理器,將來有可能實現大一統。
- 採用Swift編寫。
- 採用swift-llbuild構建編譯。swift-llbuild是一個並行、高效、增量編譯的構建系統做爲其構建引擎,因此編譯速度快,不會對不變的依賴進行重複編譯。
- 支持跨平臺,好比windows,linux,macOS,darwin。
- 支持executable類型,因此能夠用來寫命令行工具。
- 自動生成package.xcworkspace和並支持命令行生成.xcodeproj,這一點和Cocoadods很像。
- 採用了Swift來做爲配置描述語言,在Package.swift文件中進行配置,寫起來更加清晰方便。
- 使用git tag來作版本依賴,格式上遵循Semantic Versioning。
- 不支持資源文件管理,不過這個好像也已經有方案了。
Cocoadods
- 採用ruby編寫。
- 自動創建和更新一個 Xcode workspace,用來管理你的項目和全部依賴。
- CocoaPods的工程目錄中必須有一個叫作podspec的這麼一個文件,其中包含有關項目的元數據並指定了工程的的編譯方式。
- CocoaPods的DSL很繁瑣。
Carthage
- 採用Swift編寫。
- Carthage經過xcodebuild將依賴庫打包成framework,這樣能夠減小開發過程當中的編譯時間。
- Cartfile文件格式是基於OGDL(Ordered Graph Data Language)標準來組織的,這種格式支持3種類型的數據源:github和git、binary。
- 在 Xcode 裏定位到源碼不方便,是很麻煩,不方便調試。
- 由於Carthage去中心化,不修改xcodeproj,也不生成xcworkspace文件,因此須要手動引入依賴庫,很繁瑣。
- 由於提早將依賴庫打包成framework,因此在編譯主項目的時候可能會出現Swift編譯器版本不一樣的錯誤。
固然上面列的各個框架的缺點也都是能夠經過一些手段避免的,好比CocoaPods也能夠結合Cathage進行二進制化,這裏就不細講了。github
咱們本身實現的庫依賴管理工具叫Nabla,至於爲啥叫這個,向量微分算子,Nabla算子(nabla operator),又稱劈形算子。既然是理工科的起名字也要有逼格一點,像特斯拉,寒武紀這名字多有逼格😂。咱們要實現哪些功能呢?swift
功能:windows
- 採用Swift編寫。
- 可能須要實現一套DSL,這個還不肯定,暫時先用YAML來寫,也就是須要經過一個.yml來管理項目和依賴,結構上和Package.swift相似。
- 經過xcodebuild將依賴庫打包成framework,最先的時候也是想採用swift-llbuild構建編譯,但後來研究了一下,須要生成一個YAML的Build File,這一步異常麻煩,暫時放棄。
- 像SPM和CocoaPods同樣修改xcodeproj和建立xcworkspace。
- 經過git來下載依賴庫,使用git tag來作版本依賴。
系列文章
這個還沒肯定,會寫一個加一個。xcode
- 從零寫一個Cocoa庫依賴管理工具(一):建立工程結構和添加依賴
項目地址
Nablaruby