PyCharm 是很多 Python 開發者優先選擇的 IDE,功能強大,跨平臺,提供免費社群版,非常良心。如果你想自己給PyCharm新增一些功能怎麼辦呢?有兩個辦法:
今天我們說說怎麼搭建環境自己寫一個 PyCharm 外掛。
前期準備
先普及一下知識,開發 PyCharm 外掛和開發 IntellJ IDEA 外掛需要的環境是一樣的,因為 PyCharm 本身就是 IDEA 的一個子集,說白了就是 IDEA 上套了一個 Python 語言支援的外掛。其他系列的 IDEA IDE 其實也是一樣的道理,都是套了對應語言支援的框架外加一點外觀修改,就成了新的產品,比如 WebStrom,PhpStorm,RubyMine。到這裡你應該有個印象,JetBrains 這個公司太能玩了,就一個 IDEA 能整出那麼多產品來,很厲害吧?
開發 PyCharm 外掛你需要:
- 對 Java 語言有一定了解,因為你只能用 Java 開發外掛
- 安裝最新版的 IntelliJ IDEA
- 安裝 PyCharm Community Edition 到本地
- 確保 IntelliJ 安裝並啟用了
Plugin DevKit
外掛,預設自帶 - 配置 IntelliJ Platform SDK, 下文會涉及相關步驟
- (非必需)將IntellJ IDEA Community Edition 的程式碼克隆到本地,方便除錯
如果你英文還可以,也可以閱讀官方的幫助文件。
新建外掛工程
從檔案選單選擇 New Project, 選擇 IntelliJ Platform Plugin,如果你沒有配置SDK,點選New 選單。
選擇你本地 PyCharm Community Edition(社群版)的安裝路徑作為SDK目錄,Java SDK 選擇 1.8 以上的版本。
請注意,你也可以使用 PyCharm Professional (旗艦版) 的安裝路徑作為SDK目錄,不過當你除錯外掛碰到核心程式碼時,社群版你可以一步一步跟到最裡面,但旗艦版不行,因為旗艦版並不是開源的,你拿不到原始碼。
回到 New Project 的介面,點選 Next,輸入 Project name 和 Project location,點選完成。
小貼士:如果你是開啟別人的寫的外掛,那麼你直接選擇開啟工程目錄是沒有用的,因為 IntelliJ IDEA 不認為這是個外掛工程,所以你沒法執行和除錯這個外掛,一個不怎麼優雅的辦法就是從現有程式碼新建一個外掛工程,StackOverflow 關於這個的吐槽問題你搜到,如果你有更好的辦法請告訴我。當你換一臺機器把外掛程式碼克隆下來之後應該就知道我在說什麼了。
外掛工程目錄結構
一個典型的外掛目錄結構就像下圖。
- .idea 目錄 – JetBrains IDE 生成的工程都會有這麼一個目錄,存放使用者配置和快取,無需關心。
- doc 目錄 – 外掛的文件,可選。
- out 目錄 – 編譯後的程式碼位元組,無需關心。
- resources 目錄 – 資源存放目錄,外掛的配置檔案在此。
- src 目錄 – 程式碼存放的位置。
- *.iml 檔案 – 專案的配置檔案。
修改外掛資訊
開啟 /resources/META-INF/plugin.xml
, 更新外掛資訊,舉例說明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<idea-plugin version="2"> <id>com.eflabs.plugin.efcommon</id> <name>EF Common for PyCharm</name> <version>3.1</version> <vendor email="toby.qin@live.com">Toby Qin</vendor> <description><![CDATA[ <b>Able to run and debug ef common tests easily.</b><br> <br> <ul> <li>Support run/debug ef-common tests via context menu.</li> <li>Show run button in the line of test case.</li> </ul>]]> </description> <change-notes><![CDATA[ <b>v3.0</b><br> <p>Support PyCharm 171.*</p> <p>Support nested ef-common project.</p> <br> <b>Early version</b><br> <p>Bug fix: failed to get run.template in resource.</p> <p>The baby version.</p> <br>]]> </change-notes> <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description --> <idea-version since-build="171.1"/> <!-- please see http://confluence.jetbrains.com/display/IDEADEV/Plugin+Compatibility+with+IntelliJ+Platform+Products on how to target different products --> <depends>com.intellij.modules.python</depends> <extensions defaultExtensionNs="com.intellij"> <!-- Add your extensions here --> <configurationType implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationType" order="FIRST"/> <runConfigurationProducer implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationProducer" order="FIRST"/> <runLineMarkerContributor implementationClass="com.eflabs.efcommon.runLineMarker.EfCommonRunLineMarkerContributor" language="Python"/> </extensions> <actions> <!-- Add your actions here --> </actions> </idea-plugin> |
這個配置檔案裡有幾點要注意的:
<id>
和<version>
用於宣告你的外掛唯一標識,同id和version的外掛不能夠重複上傳。<depends>
節點宣告瞭此外掛的依賴條件,如果是PyCharm 適用的,那麼就寫com.intellij.modules.python
<extenstions
節點用於宣告你要擴充套件的類,只要繼承和實現對應的介面就可以了。<actions>
節點用於註冊你要實現的 Action,比如你先寫一些 Action,然後註冊到某個選單。
實現具體的業務程式碼
這裡我略過最核心的部分,因為每個人的需求和程式碼能力都不一樣,這應該去查閱Java程式設計規範。
簡而言之,就是根據你自己的需求用Java實現一些介面和方法。
執行和除錯你的外掛
如果你的程式碼已經實現了,那麼執行和除錯就比較簡單。
- 使用 Run | Run 選單來執行你的外掛,這時候會啟動一個新的PyCharm,預設安裝好你的外掛。
- 使用 Run | Debug 選單來除錯你的外掛,你可以設定斷點進行除錯。
釋出你的外掛
你可以選擇本地釋出你的外掛,也可以選擇上傳到 JetBrains 的外掛倉庫。
本地釋出安裝
如果你的外掛是內部小範圍使用,並且可能帶有敏感資訊,那麼這樣的方式會比較適合你。從主選單選擇 Build > Prepare plugin ‘my_plugin’ For Deployment。
如果成功那麼在工程目錄就會生成一個同名的 jar 檔案。
將這個檔案 copy 到目標機器就可以通過 Install Plugin from disk … 完成安裝。
釋出外掛到 JetBrains Plugin 倉庫
生成外掛的步驟和本地釋出是一樣的,唯一不同的就是你需要到 JetBrains Plugins 網站去註冊一個賬號。
登入之後選擇 UPLOAD PLUGIN 選單,上傳之後大概需要2個工作日稽核。
稽核通過後其他使用者就可以直接從 Browse Repositories… 裡搜尋到你的外掛並安裝。通過外掛倉庫安裝的外掛,一旦有新版本釋出,使用者將收到更新提示。
寫在最後
關於如何實現具體的外掛業務程式碼,一個偷懶的辦法就是去看現有功能大概是怎麼實現的,你既然可以拿到 PyCharm Community Edition 的所有程式碼,還有啥看不到的,看懂只是時間問題。再或者去 github 搜搜看,萬一有驚喜呢?
就 PyCharm 本身來說,我覺得作為 IDE 提供的功能已經很豐富了,為啥還要寫外掛呢?對啊,哪裡來的需求,會不會是一個偽需求呢。寫外掛前請你想一想這個問題。