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 提供的功能已經很豐富了,為啥還要寫插件呢?對啊,哪里來的需求,會不會是一個偽需求呢。寫插件前請你想一想這個問題。