Eclipse Che 7 支援 VS Code 擴充套件
Eclipse Che 社群近期正在開發讓 Eclipse Theia 成為 Eclipse Che 7 的預設 IDE。我們給 Eclipse Theia 增加了一個外掛模型,該外掛模型相容 Visual Studio Code (VS Code) 擴充套件。Che 7 使用者將可以直接在其雲開發工作空間中直接使用 VS Code 擴充套件。Visual Studio Code 的外掛非常流行,紅帽已經開發了很多外掛,包括 Java , XML , YAML , OpenShift , 以及 依賴分析 。而紅帽提供的 Java 擴充套件已經被下載超過 1000 萬次。
如果你對 Eclipse Theia 、Che 6 以及早期使用基於 GWT 開發的 IDE,儘管它們也可以使用外掛,但是相當的麻煩。而像 VS Code ,開發者是可以在執行時自行擴充套件他們的開發環境的。Eclipse Theia 是可以可擴充套件的開源框架,可以用來開發基於 state-of-the-art 技術的支援多語言的 IDE。在 Che 7 中預設使用 Theia IDE 為開發者擴充套件 Che 工作空間提供了一個非常好的基礎。請看 Stevan Lemeur 的一系列文章 來了解即將釋出的 Che 7 的更多資訊。
這篇文章將講述為什麼我們給 Eclipse Theia 增加新的外掛模型,以及對 Eclipse Che 7 的工作空間能帶來什麼好處。同時也將描述新的外掛模型與已有的 Theia 擴充套件模型有何區別。
基於 GWT 開發的 IDE 有什麼缺點
在 6 以及更早版本的 Eclipse Che 是基於 GWT 開發的 IDE ,有很多的缺點。例如增加一個新外掛需要停止、重新編譯以及重新載入整個 IDE。儘管也嘗試過用 JS-Interop 來動態載入 JavaScript 外掛。基於 GWT 的 IDE 提供了一個底層的 API ,最大的好處是你可以修改任何東西,但是缺點是任何外掛也可以導致其他程式崩潰。而且很那去理解當前 API 的所有入口。
最後,我們必須考慮一個問題是,很多使用者不喜歡 GWT,感覺它像是一個過時的技術。
對擴充套件的要求
根據我們的經驗判斷,多數使用者希望 Eclipse Che 下一個主要更新版本能提升這方面的體驗。因此 Che 7 將滿足以下幾點要求:
1. 應該很輕鬆的在執行時載入外掛,不需要額外的編譯和安裝步驟。所以外掛應該事先編譯好,IDE 只需要載入程式碼即可。
2. 一個寫得很爛的外掛不會導致 IDE 崩潰。如果使用者載入的外掛執行錯誤,使用者仍然可以正常使用當前 IDE。
3. 在 Eclipse Che 中我們要保證一個外掛不會堵塞 IDE 主要的功能,例如開啟檔案和輸入程式碼等。使用者能知曉某個問題是某個外掛導致的或者是核心產品本身導致的。同時應該允許兩個外掛依賴了版本衝突的其他元件。每一個外掛有其特定的、獨立的版本依賴。
Theia 擴充套件模型的缺點
作為 Che 7 以及更新版本的可選 IDE,Eclipse Theia 本身自帶一個擴充套件模型,這裡我們稱之為 Theia 擴充套件。由於 Theia 的擴充套件模型主要用於 IDE 的定製開發,所以當開發者想像 VS Code 那樣在執行時嘗試定製他們的開發工作空間時就會有一些類似的問題:
1. 使用 Eclipse Theia 時,當增加了一個新的擴充套件,整個 IDE 需要重新編譯。如果擴充套件包含一些錯誤的話,會導致整個 IDE 崩潰。因此在新增完出錯的擴充套件後,你會在開啟 Che 工作空間時碰到一個空白頁面。
2. 擴充套件是從 npmjs 倉庫中後去的,這很好,因為 npmjs 有大量的第三方庫可供使用。當你下載一個擴充套件時,你會下載該擴充套件的所有依賴,這很有可能也導致 IDE 出錯。此外你無法新增本地的私有擴充套件。
3. Theia 擴充套件允許擴充套件的作者定製整個 IDE,這個和基於 GWT 的 IDE 是一樣的,任何擴充套件的問題都會導致整個 IDE 出問題,而且很難診斷。
5. 複雜的擴充套件模型對新的開發人員來說難度太高。Theia 擴充套件模型對高階開發者來說非常強大。但是如果你想編寫你的第一個擴充套件,你必須精通 inverify 和依賴注入。你還需要每個類在做什麼工作,你需要實現哪些介面。
很明顯 Theia 的擴充套件模型不滿足我們對擴充套件的要求。
Theia 的外掛介紹
在紅帽公司,為了滿足我們對擴充套件的要求,我們提出了 Theia 外掛模型。關鍵點包括:
1. 外掛可以在執行期間的任意時刻載入,而無需重啟 IDE。
2. Eclipse Theia 外掛是自包容的,可以打包到一個單獨的 .theia 檔案中。該檔案包含所有執行時所需的程式碼。因此無需在啟動時下載別的依賴。
3. Theia 外掛提供很簡單的 API ,學習成本很低。你可以自行選擇使用一個依賴注入框架,但這並不是必須的。該模型簡單到只需要引入一個名稱空間 @theia/plugin
(通過 npmjs
的 @theia/plugin 包
),然後你可以從該物件作為入口後去你需要的任何東西。你可以通過 start 和 stop 函式自行實現外掛的生命週期。
Theia 外掛示例程式碼:
import * as theia from '@theia/plugin'; export function start(context: theia.PluginContext) { const informationMessageTestCommand = { id: 'hello-world', label: "Hello World" }; context.subscriptions.push(theia.commands.registerCommand(informationMessageTestCommand, (...args: any[]) => { theia.window.showInformationMessage('Hello World!'); })); } export function stop() { // commands automatically unregistered }
Theia 外掛協議
Theia 外掛使用一種協議,意味著你在其他地方也可以執行該外掛。一些使用瀏覽器的 worker 執行緒執行(可以稱為前端外掛),或者可以在伺服器端以獨立程序方式執行(後端外掛)。你可以很容易的處理各種型別的名稱空間,包括 VS Code 擴充套件。
下面是一個架構圖:
該模型是向後相容的。通過一個 TypeScript 宣告檔案來提供這個外掛模型。外掛程式碼可以完全重寫或者也可以對 Theia 類進行重構。不過模型仍然保持不變。
Theia 外掛模型的 API 是高階 API ,因此外掛不會導致 IDE 崩潰。你不能通過一個外掛來改變所有功能,但還是為開發者提供了近乎沒有限制的功能。
容器就緒
Eclipse Che 是一個使用容器技術的開發者工具。Theia 外掛使用 TypeScript/JavaScript 編寫,二者相容非常好。但是外掛作者有時候需要一些額外的依賴,這些依賴不一定存在於 npmjs 中。例如,如果開發者為 Java 編寫一個語言伺服器,那麼外掛就需要 Java 的支援。因此這就可能會影響運行了 Eclipse Theia 的容器,容器本身也需要提供 Java 的支援。
這就是為什麼 Eclipse Che 要讓每個 Theia 外掛執行在其獨立的容器中的原因。這樣就可以讓外掛擁有自身獨立的系統依賴。
預設下,所有外掛是在 Theia 容器中使用獨立程序執行的:
VS Code 擴充套件
Eclipse Theia 外掛協議是通過一種可擴充套件的方式來實現的,而且遵循 VS Code API。所以這讓 Theia 可以直接執行 VS Code 外掛。同時 Theia 提供 API 來檢查擴充套件是否相容。
例如,下面是在 VS Code 擴充套件市場上的一個 SonarLint 的 VS Code 擴充套件:
在載入完 SonarLint VS Code 擴充套件後,你可以立即在一個 JavaScript 原始檔中檢視到執行結果:
這是在 Eclipse Theia 載入了 VS Code 擴充套件後的外掛檢視: