版權聲明

所有的部落格文章都可以在右邊[blog文章原始檔案]下載最原始的文字檔案,並依你高興使用 docutil 工具轉換成任何對應的格式方便離線閱覽,除了集結成書販賣歡迎任意取用,引用

What is Bundle??

What is Bundle??

寫過真正的程式的人都知道,寫程式不難,寫完以後才是困難的開始,有時候光 Bug 回報就 壓垮一個自信滿滿工程師的信心,就算中樂透沒重大 bug ,事後的版本維護,功能增減也是 大問題,我覺得程式本身都沒什麼難的,應該說都是有答案的,演算法不好用暴力解法也是 解的出來,不會最佳化時間複雜度(Big-O)就用更快的cpu,軟體開發真正難的我覺得是人 的問題,每個人都有自己的意見,工程師和業務觀點又不同,這些才是困難的,說實話電腦 比人好搞多了.....

上面引言和今天筆記的主題完全沒關係,今天要說得是 OSX 上面對於程式管理的一個東西 [1] Bundle ! Bundle 說穿了就是把一個程式所需要所有的相關資源都到一起統一管理的一 個技術,程式需要的資源,函式庫,string table等等都放到一個目錄下面,然後 Finder 會將這個目錄封裝起來,並呈現為單一程式的樣子,讓使用者可以完全受騙,感覺程式只有 單一執行檔這樣...

比如 FireFox 在 Windows XP 檔案總管下看起來是這樣:

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqJWNjtAtUtuIqpngnMg9wSXo7MWdVpx7VeyMp9qtGxRuk_-1DBA_bAPr0_y-jB-3FgY1qOSHlyOJ0qDZlVvQ-GDMnMMk6kh6VHqgQLy33IIXjd8J8QDWr2TNIh2jSzOuK6OTL_yEnDaY/s800/firefox.jpg

在 mac 上面卻很漂亮....

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQgJFlee-qYkmlvZ9GmM3wzBMfRf0DSlmxpNXkDDwQCBWoUNSbkpI3ielC5hFRyvRo9hP2DlBj7w1Ebokq83IF6ro0fnnrB2J1MyvAvozK51jxPNk5n0QADyvnIAiz9wWVAXy59psW7wuP/s720/firefox_mac.png

好啦,平心而論這是一種抹黑 Windows 的手法,因為一般使用者根本只會看到[開始]功能表 裡面的捷徑,不然就是桌面上的捷徑,這樣其實和mac差不多,都是看到單一進入點的執行檔 ,相對來說 mac 對於沒那麼基本的使用者來說相對麻煩,因為要打開超好用的終端機才能順利 進去看bundle 真正的內容,windows 只要知道安裝在哪就可以用超難用的檔案總管去看了。

對於 Bundle Apple在網頁上面有列出一堆他的優點:

  • Bundles are directory hierarchies in the file system. A bundle contains real files that can be manipulated by all file-based services and API.
  • The bundle directory structure makes it easy to support multiple localizations. You can easily add new localized resources or remove unwanted ones.
  • Bundles can reside on volumes of many different formats, including multiple fork formats like HFS, HFS+, and AFP, and single-fork formats like UFS, SMB, and NFS.
  • Users can install, relocate, and remove bundles simply by dragging them around in the Finder.
  • Bundles that are also packages, and are therefore treated as opaque files, are less susceptible to accidental user modifications, such as removal, modification, or renaming of critical resources.
  • A bundle can include separate executables for different target platforms. For example, a bundled application could include separate executables for Mac OS 9 and Mac OS X.
  • A bundle can support multiple chip architectures (PowerPC, Intel), library architectures (CFM/MachO), and other special executables (for example, optimized libraries for AltiVec).
  • Most executable code can be bundled. Applications, frameworks (shared libraries), and plug-ins all support the bundle model.
  • An application can run directly from a server. No special shared libraries, extensions, and resources need to be installed on the local system.

簡單來說 bundle 就是一種聰明的目錄,可以把軟體相關的資源檔案全部包在一起。。。

Bundle types

OSX 有兩種基本的 Bundle 型態:

  1. modern bundle
  2. versioned bundle

modern bundle 通常用於一般可執行軟體或 plug-in, versioned bundle 通常用在 Framework [2] ,不同的 bundle 型態其目錄內部構造也會不同。

[1]: 其實我也不知道這是哪個版本才有的東西,畢竟對MAC的歷史不熟。
[2]: Apple 發明類似 DLL/ static library 的東西..

Modern Bundle

Modern Bundle 架構很簡單,只有一個子目錄 Contents/ 其他雜七雜八的東西都在這個 Contents/ 下面, 有興趣的話可以隨便找一個來觀察,目錄 /Application 下面應該就充滿 Modern Bundle,可以隨便選一個 有興趣的進去瞧瞧。

在 Contents/ 下會有一個十分重要的檔案 -> Info.plist , info.plist 是個 XML 格式的設定檔案,內容 包含一些 Bundle 的資訊和設定,比如說 Bundle 名稱,版本,執行檔位置, Serviec 文件格式等等。

假如 Contents/ 下面有一個子目錄是 MacOS/ 裡面擺得就是OSX執行檔和相關檔案,相對的 MacOSClassic/ 就是相容於 OS 9 的執行檔和相關檔案。

Resource/ 目錄下面寫過 Windows 的人應該可猜出是幹麼用的,像 GUI 這種寧可犧牲效率(疑!?)也要 死命討好用戶五官的軟體,都有一籮筐看起來好看的圖形,聽起來炫的音效,或是視窗佈局等等的檔案,用處 很低可是大家都喜歡,我就很稿不懂以前寫過一個 Win32 GUI 的軟體,老闆不知道哪跟筋不對,叫工程師一 定要把 menu 加上 icon。。。 離題了,反正這個目錄下面就是擺這些軟體要使用的資源。

除了上介紹的目錄,可能還會有 PlugIn/ Framework/ 等等其他的子目錄,端看軟體的需求。

Versioned Bundle

Versioned Bundle 屬於 Framework 的範圍,這又是另一個好長的故事了,有空再說。。

沒有留言:

Related Posts with Thumbnails