級別: 中級
Cameron Laird, 副總裁, Phaseit Inc.
2007 年 3 月 06 日
Portland 是個新的開源項目,它承諾要幫助 Linux® 應用程序在多種桌面環境中運行,包括 Gnome 和 KDE,從而簡化 Linux® 應用程序的部署和商業化。雖然該技術仍很年輕,但現在已經可以使用 Portland 了,並且它看上去正在不斷快速改進。現在開始使用 Portland 1.0 中的 XdgUtils 工具集。在構建桌面 Linux 應用程序的開發計劃時,可能需要適當考慮到底針對哪個桌面 環境(DE)進行開發。Gnome 還是 KDE?當然可能還有其他的桌面。
但是如果只考慮一種桌面環境,那麼應用程序的銷售可能不會長久,以 Portland 項目 為例。
Portland 項目
首先介紹一些背景知識。Portland 項目是為了解決一些惱人的問題,這些問題將在軟件開發人員編寫易於移植到所有 Linux 發行包中打包的各種桌面環境(DE)時制造麻煩。具體來說,Portland 的目標是提供一套開發人員可編寫的通用 API,從而使應用程序無需考慮桌面環境。
該項目第一個也是目前實現的階段 Portland 1.0,名為 XdgUtils,它是一些實用程序的捆綁,應用程序可以用它在現有的桌面環境上運行。第二個階段 Portland 2.0 的計劃包含基於 D-Bus 接口的面向服務的進程間通信機制。
雖然 XFCE、GNUStep 和 MacOS X 也在未來的考慮之中,但 Portland 目前只支持 KDE 和 Gnome。
在本文中,將開始使用 Portland 的 XdgUtils 部分,還將了解 Portland 的設計如何反映其更廣泛的目標。
請看清單 1,它顯示了 xdg-email 實用程序的用法:
清單 1. xdg-email 的示例用法# This invocation is valid for all desktop # environments and any e-mail client a user # may prefer. xdg-email --cc $COLLEAGUE --bcc $SELF \ --subject "Problem report" \ --body "This is a semi-automated fault report. You can edit this e-mail before sending it. Note that the problem log is automatically attached." \ --attach $LOG errors@$OUR_HOME
看到其中發生的變化了嗎?這一個命令就替代了為適應諸如 Firefox、elm、/bin/mail、Opera 等等眾多電子郵件客戶機而需要實現的數頁腳本。
為了更容易理解和全面應用這類命令,這裡介紹一些背景:桌面環境包含 窗口管理器、圖標、工具欄、應用程序、牆紙、功能(包括拖放)和構成桌面計算機用戶即時體驗的獨特外觀和感受。常見的桌面環境有 Gnome、KDE、XPde、ALDE、Xfce 及其他。您希望您的程序在自己和客戶或同事使用的桌面環境上看起來很 “自然”,而且運作良好:剪切和粘貼應當立即發生,顏色調色板不會損壞客戶的屏幕,應用程序的正確安裝應當顯示在桌面應用程序選擇菜單中合理的位置。
一直到最近,實現這些目標的可靠方式還是使用和熟悉特定桌面環境的規范 —— 例如 KDE —— 然後請教專家或者重新學習每一種其他桌面環境要求的規范。在這個級別上,重點很少是實現特殊的功能或者用復雜的方式移植應用程序;原則上講,正確安裝的 Linux 應用程序應該能用任何桌面環境的窗口管理器顯示。只有安裝中更精細的細則,包括必要的庫的位置以及一些較小的圖形修飾,才會區別不同的桌面環境。
但是,如果不只是為自己和少數程序員開發應用程序,而是要開發廣泛發行的商業產品,那麼正確了解這些細節是必需的。請注意,我沒有研究最終用戶將看到的生動的顯示效果:Portland 並不解決 GUI 主題的 “花俏”,或者陰影效果又或者虛擬文件系統創新。Portland 只是幫助開發人員的代碼在進行安裝和部署自動 化時,呈現更合理的界面。
清單 1 顯示了一個典型的現實示例,給出了一個最終用戶能夠在其所選的電子郵件客戶機中編寫的電子郵件消息。Portland 定義了 xdg-email 命令,它管理這類任務中包含的所有常見套路。調用這樣的命令行會啟動用戶的電子郵件客戶機,填充它的元素(例如列表、附件等),並把控制權轉移給最終用戶。應用程序需要這種幫助嗎?如果需要,那麼 Portland 正是為您准備的。
更多內容請看Linux應用 Linux應用技巧 桌面環境-系統美化專題,或
Portland 初探
去年,Portland 實用程序才開始面向公眾,但是不要沮喪:這個項目正在不斷地實現它的目標,即使是現有的版本,也非常有用。不過它仍然缺少詳細的教程和其他的一些標准規范。
要開始使用 Portland,請用匿名 CVS 獲得源代碼:
cvs -d :pserver:[email protected]:/cvs/portland \co portland/xdg-utils
這樣就下載了一組命令行工作 XdgUtils,還有初步測試計劃、 測試套件的開頭部分、基本的安裝程序、Html 化的手冊和少量管理文件。文檔和其他優化最後會包含在其中。 Portland 還集合了稱為 桌面 API (DAPI)的 C 綁定。 下一節將會看到 DAPI。
XdgUtils 包含的工具能夠完成下面的功能:
安裝和卸載桌面圖標、圖標資源和菜單項 使用用戶喜歡的編輯器或郵件用戶代理編寫電子郵件 查詢和管理文件類型(.gif、.c 等)和它們的描述 使用用戶選擇的合適的應用程序打開文件或 URL(如 Windows® 的 start 命令行或 Mac OS X 的 open) 控制屏幕保護程序 使用一致和安全的方式增加程序權限使用任何語言或開發環境的開發人員應當都能訪問這些工具;可以使用編程方式調用它們,如同使用 shell 中的其他命令一樣。例如,如果正在使用 Python,那麼可以在 bash 代碼編寫的安裝腳本中使用 XdgUtils 工具,也可以使用系統調用,就像下面這樣:
os.system("xdg-open %s" % chosen_URL)
或者,也可以使用 Python 的任何其他函數更精細地控制外部進程。
乍看之下,Portland 的目標很普通。它只是用一致的方式包裝了現有的功能 —— 圖標的安裝、屏幕保護程序的管理,所以開發人員不必為每個新的應用程序或要使用的桌面環境重新創建所有基本內容。而且實現該目標的代價非常小:Portland 的開源許可使得使用 Portland 無需金錢上的開支,其簡單性實現了只花費很少的時間就可下載、安裝和使用 Portland。結論很明顯:很小的投資就得到了確切而顯著的回報。所以這是個很容易做出的選擇。
光輝的前景
如果相信 Portland 從現在開始還會繼續發展下去,那麼就很容易做出選擇了。對於初始發行版,多數工作放在了基於 Linux 的 Gnome 和 KDE,而且 Xfce 也得到了 Waldo Bastian 所稱的 “極大關注”,Waldo Bastian 是 Intel 公司 Linux 客戶機架構師,一名主要的 Portland 貢獻者。當 Portland 獲得其首次成功應用之後,很自然會預測到它會擴展到更多桌面環境,甚至擴展到其他操作系統,例如 Solaris 或 FreeBSD。它的命令行實現當然可以讓它擴展到新領域。從開發經理的角度來看,我很高興為 Portland 界面編寫代碼。如果我的客戶需要移植到 Portland 還不支持的桌面環境,對我們來說,實現一個正確的 Portland 擴展不會比把我們自己的代碼應用到不支持的桌面環境上更難。
而且情況應當只會隨著時間而改善。如果當前實現像我期待的那樣流行,那麼廠商,包括發行打包商,都會有興趣維護和更新 Portland,尤其會使用特定於操作系統的方式來適應它們。同時,Portland 團隊保證不會修改編程接口。Intel 的 Tom Whipple 准備的測試套件應當有助於保證這種穩定性。
圍繞 Portland 有幾個公開的問題。打包標准這個問題仍然需要協商。Portland 的設計者們很明智地對他們的架構設計進行最大程度地解耦;目前來說,打包問題已經被隔離,甚至還不知道最終的解決方案會是否是 Portland、Linux Standard Base(LSB)或其他工作的一部分。目前,Portland 仍只局限在編程訪問典型窗口管理器的圖標和其他組件。一旦發布了 KDE 4,編程接口可能會擴展到包含圖標命名和共享的 MIME 數據庫規范。
請記住,如果願意,可以用稱為 DAPI 的 C 綁定進行窗口管理器級別的進程間訪問。盡管 XdgUtils 更加成熟,還可以從項目的 CVS 庫中獲得 DAPI 的早期發行版:
cvs -d :pserver:[email protected]:/cvs/portland \co portland/dapi
有效的 DAPI 編碼可以是模塊化的,也可以是面向事件的。面向事件的情況下,應用程序連接到 DAPI,然後用 select() 方法偵聽活動。模塊化調用的示例是清單 2 中打開資源的函數(對發行版文檔中的函數稍微做了修改)。
清單 2. 打開 URL 的 DAPI C 代碼示例
/* Initialize with dapi_connectAndInit(). */ static DapiConnection* my_dapi_connection; int openURL(const char *url) { /* DAPI wants to know about toplevel_widget so it can properly handle focus, layering, ... */ if (dapi_OpenUrl_window(my_dapi_connection, url, XWINDOW_HANDLE(toplevel_widget))) return 1; /* Handle failure here ... */ }
更多內容請看Linux應用 Linux應用技巧 桌面環境-系統美化專題,或
結束語
如果應用程序,特別是應用程序的安裝程序,直接處理桌面環境,那麼 Portland 能提供一種實現相同功能的更好途徑。 只要對源代碼做最少的修改,以及最少的許可影響或最少的編程困難,並且不會犧牲任何功能,就能夠使用 Portland,獲得多於自己所能數倍的移植性。而且從此還能利用未來 Portland 具備的任何增強和擴展。
參考資料
學習
您可以參閱本文在 developerWorks 全球網站上的 英文原文。 The Portland project wiki 提供了 Portland 項目的概述。 The Linux Standard Base(LSB)是應用程序二進制接口(ABI),必須處理二進制執行文件格式,還包括允許一個 Linux 發行版上生成的應用程序在另一個 Linux 發行版中正確啟動。 要學習如何把應用程序移植到 LSB 和確保它們符合 LSB 規范,請閱讀教程 “向 Linux Standard Base 進行移植”(developerWorks,2006 年 8 月) developerWorks 中國網站 Linux 專區 提供面向 Linux 開發人員的更多參考資料。 隨時關注 developerWorks 技術活動 和 網絡廣播。獲得產品和技術
Portland 還提供了 WebCVS views,允許浏覽每個文件及其修訂版以及前面提到的 VCS 訪問。 freedesktop.org 和 OSDL 是 Portland 項目的兩個關鍵方面。OSDL 和自由標准組織(Free Standards Group)最近合並為 Linux 基金會。 訂購 SEK for Linux,共包含兩張 DVD,其中有用於 Linux 的最新 IBM 試用軟件,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。 使用可以直接從 developerWorks 下載的 IBM 試用版本軟件,在 Linux 上構建下一個開發項目。討論
請參閱 Portland 和 Desktop_architects 郵件列表,包含眾多 Portland 業務。 通過參與 developerWorks blogs 加入 developerWorks 社區。
關於作者
Cameron Laird 是 developerWorks 長期投稿者和前專欄作家。他經常編寫關於促進其公司應用程序開發的開源項目的文章,主要關注可靠性和安全性。
更多內容請看Linux應用 Linux應用技巧 桌面環境-系統美化專題,或