Mastodon

用 framework 的方式重用 cocoa 源碼

開發軟件時「重用」是十分重要的概念,然而到此為止在 iOS 下要重用自己的源碼或開放源碼的專案卻不是那麼簡單。

通常我們有以下方法重用源碼:

  1. 把獨立的源碼檔外分開存放,新專案需要他們時,手動把源碼拉進 XCode。大部份 opensource Objective-C 專案也是用這方法。例如 ASIHTTPRequest
  2. 做一個 Static Library 的專案 ,再在新專案裡把這個 static library 設為 dependencies。在 build 時就會自動 build 這些 dependencies 專案。一些比較複雜的 library 例如 Three20 就是用這種方法。
  3. 跟 Apple 的做法一樣,把專案做成 framework。這方法 framework 以 binary 的型式加進專案中,編寫新專案的人不需理會和編譯 framework。

第 1 個方法是最簡單的方法。然而它要求 Library 用家對 Library 源碼有一定認識:需要用那些檔案,要怎樣編譯等等。如果 Library 有新的源碼,用家又要把新的檔案加進目的專案裡。

第 2 個方法是為了解決管理專案的問題而作的。它的好處是用戶不需要懂得怎樣管理 Library 專案。但用戶仍需要注意編譯 Library 專案的問題,如果 Library、編譯器或 IDE 更新了,有可能不能重新編繹一模一樣的 Library。

第 3 個方法讓用戶最輕鬆,基本上只需要把 framework 加進目的專案中便行。你甚至可以控制那些 headers 開放給用家,封裝 API 時更有彈性。

唯一問題是:Apple 沒有公開怎樣造這種 framework 的秘密!對,XCode 沒有 framework 的 template,它的內部運作也沒有甚麼文件說明。幸好有厲害的開發者研究出怎樣做 framework 的方法,並將之寫成 XCode template。只要到 iOS Universal Framework 就可以把你常用的元件分割成為獨立的 binary ,輕鬆重用了。

現在我會把一些自家的獨立元件,以及一些常用的第三方元件 (如 ASIHTTPRequest) 包成 framework ,這樣需要用的時候只需將他們拖放到專案中,不需要擔心 framework 版本和編譯問題了。

P.S.

當然了,無論用以上哪一個方法,所有的源碼和外加 framework 也應該加進專案的版本管理系統中。

如果用 1 或 2 的方法就應該用 git submodule 的方法確實記錄 library 的版本和位置,用 3 就直接 commit 和記錄使用的版本。如果是自己可控制的 framework ,最好加進自己的 version 進 header 或 api 上。

如果 Objective-c 也有像 ruby 的 gems 或 bundler 那有多好?

延申閱讀