當前位置:
首頁 > 知識 > 如何開發一個 PyCharm 插件

如何開發一個 PyCharm 插件

(點擊

上方藍字

,快速關注我們)




來源:cicaday


segmentfault.com/a/1190000009126037


如有好文章投稿,請點擊 → 這裡了解詳情




PyCharm 是很多 Python 開發者優先選擇的 IDE,功能強大,跨平台,提供免費社區版,非常良心。如果你想自己給PyCharm添加一些功能怎麼辦呢?有兩個辦法:





  1. 通過提需求實現,到 JetBrains 的 github 去提issue或者自己發Pull Request請他們merge。



  2. 通過安裝插件實現,你可以查找現有的插件倉庫,或者,自己寫一個。




今天我們說說怎麼搭建環境自己寫一個 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 的代碼克隆到本地,方便調試



如果你英文還可以,也可以閱讀官方的幫助文檔。




http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started.html




新建插件工程




從文件菜單選擇 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, 更新插件信息,舉例說明。





<

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。







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







將這個文件 copy 到目標機器就可以通過 Install Plugin from disk … 完成安裝。




發布插件到 JetBrains Plugin 倉庫




生成插件的步驟和本地發布是一樣的,唯一不同的就是你需要到 JetBrains Plugins 網站去註冊一個賬號。






  • https://plugins.jetbrains.com/




登錄之後選擇 UPLOAD PLUGIN 菜單,上傳之後大概需要2個工作日審核。







審核通過後其他用戶就可以直接從 Browse Repositories… 里搜索到你的插件並安裝。通過插件倉庫安裝的插件,一旦有新版本發布,用戶將收到更新提示。




寫在最後




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




就 PyCharm 本身來說,我覺得作為 IDE 提供的功能已經很豐富了,為啥還要寫插件呢?對啊,哪裡來的需求,會不會是一個偽需求呢。寫插件前請你想一想這個問題。




看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

Python 魔術方法(Magic Method)
隨機之美,隨機森林
Django 使用 Celery 實現非同步任務
用 Python 做股市數據分析(二)
Python 爬蟲實戰:股票數據定向爬蟲

TAG:Python開發者 |

您可能感興趣

Chrome web 開發用到的插件
Unity新插件允許開發者在HoloLens上預覽PC端3D內容
Web Security事件發酵,Mozilla移除23個可疑插件程序
Chrome插件型數字錢包Metamask將支持ETC
我的Chrome插件列表
解釋Electra工具上的Cydia整理插件源跳出錯誤提示!
AMD為macOS版Blender和Maya發布Radeon ProRender插件
從零到壹:Cytoscape插件使用心得 MCODE篇
MyBatis 分頁插件的實現
Oculus Unity插件通過開放API添加Windows MR支持
微軟宣布Edge瀏覽器基於Chromium 支持現有的Chrome插件
Photoshop詳細解析CameraRaw插件使用
Chromium版Edge瀏覽器上手:已支持原生Chrome插件
【插件發布】InteracTool
那些我離不開的 Sketch 插件
叫板 Android 開發!跨平台應用開發神器 Flutter 又添開源插件!
WordPress代碼高亮插件Pure-Highlightjs
WordPress插件WooCommerce任意文件刪除漏洞分析
WordPress分類和標籤排序插件:WP Term Order
解決插件ButterKnife在Library中使用的問題