如何開發一個 PyCharm 插件

PyCharm 是不少 Python 開發者優先選擇的 IDE,功能強大,跨平臺,提供免費社區版,很是良心。若是你想本身給PyCharm添加一些功能怎麼辦呢?有兩個辦法:html

  1. 經過提需求實現,到 JetBrains 的 github 去提issue或者本身發Pull Request請他們merge。python

  2. 經過安裝插件實現,你能夠查找現有的插件倉庫,或者,本身寫一個。git

今天咱們說說怎麼搭建環境本身寫一個 PyCharm 插件。github

前期準備

先普及一下知識,開發 PyCharm 插件和開發 IntellJ IDEA 插件須要的環境是同樣的,由於 PyCharm 自己就是 IDEA 的一個子集,說白了就是 IDEA 上套了一個 Python 語言支持的插件。其餘系列的 IDEA IDE 其實也是同樣的道理,都是套了對應語言支持的框架外加一點外觀修改,就成了新的產品,好比 WebStrom,PhpStorm,RubyMine。到這裏你應該有個印象,JetBrains 這個公司太能玩了,就一個 IDEA 能整出那麼多產品來,很厲害吧?編程

開發 PyCharm 插件你須要:緩存

  • 對 Java 語言有必定了解,由於你只能用 Java 開發插件框架

  • 安裝最新版的 IntelliJ IDEAide

  • 安裝 PyCharm Community Edition 到本地測試

  • 確保 IntelliJ 安裝並啓用了 Plugin DevKit 插件,默認自帶網站

  • 配置 IntelliJ Platform SDK, 下文會涉及相關步驟

  • (非必需)將IntellJ IDEA Community Edition 的代碼克隆到本地,方便調試

若是你英文還能夠,也能夠閱讀官方的幫助文檔。

新建插件工程

從文件菜單選擇 New Project, 選擇 IntelliJ Platform Plugin,若是你沒有配置SDK,點擊New 菜單。

idea-plugin-sdk-1

選擇你本地 PyCharm Community Edition(社區版)的安裝路徑做爲SDK目錄,Java SDK 選擇 1.8 以上的版本。

請注意,你也可使用 PyCharm Professional (旗艦版) 的安裝路徑做爲SDK目錄,不過當你調試插件碰到核心代碼時,社區版你能夠一步一步跟到最裏面,但旗艦版不行,由於旗艦版並非開源的,你拿不到源代碼。

idea-plugin-sdk-2

回到 New Project 的界面,點擊 Next,輸入 Project nameProject location,點擊完成。

idea-new-project

小貼士:若是你是打開別人的寫的插件,那麼你直接選擇打開工程目錄是沒有用的,由於 IntelliJ IDEA 不認爲這是個插件工程,因此你無法運行和調試這個插件,一個不怎麼優雅的辦法就是從現有代碼新建一個插件工程,StackOverflow 關於這個的吐槽問題你搜到,若是你有更好的辦法請告訴我。當你換一臺機器把插件代碼克隆下來以後應該就知道我在說什麼了。

插件工程目錄結構

一個典型的插件目錄結構就像下圖。

idea-project-structure

  • .idea 目錄 - JetBrains IDE 生成的工程都會有這麼一個目錄,存放用戶配置和緩存,無需關心。

  • doc 目錄 - 插件的文檔,可選。

  • out 目錄 - 編譯後的代碼字節,無需關心。

  • resources 目錄 - 資源存放目錄,插件的配置文件在此。

  • src 目錄 - 代碼存放的位置。

  • *.iml 文件 - 項目的配置文件。

修改插件信息

打開 /resources/META-INF/plugin.xml, 更新插件信息,舉例說明。

<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>

這個配置文件裏有幾點要注意的:

  1. <id><version> 用於聲明你的插件惟一標識,同id和version的插件不可以重複上傳。

  2. <depends> 節點聲明瞭此插件的依賴條件,若是是PyCharm 適用的,那麼就寫 com.intellij.modules.python

  3. <extenstions 節點用於聲明你要擴展的類,只要繼承和實現對應的接口就能夠了。

  4. <actions> 節點用於註冊你要實現的 Action,好比你先寫一些 Action,而後註冊到某個菜單

實現具體的業務代碼

這裏我略過最核心的部分,由於每一個人的需求和代碼能力都不同,這應該去查閱Java編程規範。

簡而言之,就是根據你本身的需求用Java實現一些接口和方法。

運行和調試你的插件

若是你的代碼已經實現了,那麼運行和調試就比較簡單。

  • 使用 Run | Run 菜單來運行你的插件,這時候會啓動一個新的PyCharm,默認安裝好你的插件。

  • 使用 Run | Debug 菜單來調試你的插件,你能夠設置斷點進行調試。

發佈你的插件

你能夠選擇本地發佈你的插件,也能夠選擇上傳到 JetBrains 的插件倉庫。

本地發佈安裝

若是你的插件是內部小範圍使用,而且可能帶有敏感信息,那麼這樣的方式會比較適合你。從主菜單選擇 Build > Prepare plugin 'my_plugin' For Deployment

idea-deploy-local

若是成功那麼在工程目錄就會生成一個同名的 jar 文件。

idea-deploy-local-2

將這個文件 copy 到目標機器就能夠經過 Install Plugin from disk ... 完成安裝。

發佈插件到 JetBrains Plugin 倉庫

生成插件的步驟和本地發佈是同樣的,惟一不一樣的就是你須要到 JetBrains Plugins 網站去註冊一個帳號。

登陸以後選擇 UPLOAD PLUGIN 菜單,上傳以後大概須要2個工做日審覈。

idea-deploy-remote

審覈經過後其餘用戶就能夠直接從 Browse Repositories... 裏搜索到你的插件並安裝。經過插件倉庫安裝的插件,一旦有新版本發佈,用戶將收到更新提示。

寫在最後

關於如何實現具體的插件業務代碼,一個偷懶的辦法就是去看現有功能大概是怎麼實現的,你既然能夠拿到 PyCharm Community Edition 的全部代碼,還有啥看不到的,看懂只是時間問題。再或者去 github 搜搜看,萬一有驚喜呢?

就 PyCharm 自己來講,我以爲做爲 IDE 提供的功能已經很豐富了,爲啥還要寫插件呢?對啊,哪裏來的需求,會不會是一個僞需求呢。寫插件前請你想想這個問題。

關於做者:

Toby Qin, Python 技術愛好者,目前從事測試開發相關工做,轉載請註明原文出處。

歡迎關注個人博客 https://betacat.online,你能夠到個人公衆號中去當吃瓜羣衆。

Betacat.online

相關文章
相關標籤/搜索