IDEA插件開發,我是如何把公司的發布系統搬到IDEA里的


img

不得不說JetBrains公司直的非常的牛B,每一個程序員都能在JetBrains的官方網站找到一款屬於自己的開發工具。這些開發工具在工作中給我們帶來了巨大的便利。各種各樣的基礎插件,第三方插件,真是誰用誰知道,快速的代碼提示,語法檢測,更重要的是提供了很多UI插件。曾幾何時我也想過能自己開發一個IDEA的插件,終於經過一個多星期的摸索,我也能馬馬虎虎的開發一個插件出來!我相信看了這篇文章,你也能開發出一個自己的插件!

我要做什么?

先介紹下,我們的部署環境流程是這樣的

  • 測試
  • Beta
  • 灰度
  • 正式

那么我們正常的發布代碼流程就是把開發節點合並某環境分支,然后利用部署系統部署!簡單來說就兩個流程,

1、合並分支

2、發布代碼

那么針對這兩個動作,我們就開發一個這樣的插件,直接在IDEA里干完以上所有的事情。

安裝環境

網上有很多教程,大多都是千篇一律,互相抄襲!官方也有教程,但是官方那文檔,反正我是看不懂!就用我們當前用的IDEA即可,

New->Project、選擇圖上畫的三個即可,Next.接下來填寫基本信息、包名等。然后等着構建Gradle項目吧。

構建完了,一定要重新配置下SDK

構建一個插件SDK,就按着步驟點即可,因為我們要用插件的SDK來開發插件,原生的SDK滿足不了我們!

有點慢的同學可以配置下兩個參數,這我也是從網上看到的,

  • ~/.gradle/gradle.properties這個文件里追回org.gradle.daemon=true, 沒有文件,創建一個即可。

  • 修改build.gradle

    repositories {
        mavenLocal()
    		// 加上這個地址
        maven { url "https://maven.aliyun.com/nexus/content/groups/public/" }
    }
    

build.gradle

大致介紹下這個文件,類型Maven的POM文件,管理項目的配置。關注幾個重要的地方,其他不影響開發流程。大家可以對比下自己的初始項目。

//項目依賴  我加載了 hutool/okttp/lombok
dependencies {
    implementation 'cn.hutool:hutool-all:5.7.14'
    implementation "com.squareup.okhttp3:okhttp:3.3.1"

    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.20'
    annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.20'

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

//更新日志,會顯示在插件介紹里。
patchPluginXml {
    changeNotes = """
     <ul>
        1.0.0
        <li>支持發布代碼</li>
        <li>支持執行任務</li>
     </ul>
    """
}

plugin.xml

這個是配置插件功能的地方,有點類似Spring管理Bean的Xml文件!自己打開看即可。后面實戰的時候會具體介紹。正常一個初始的插件項目類似下面這樣!

實戰

這次我要做這樣的一個插件!

因為我們的發布系統需要登錄,所以我加了一個授權Token的操作,也就是拿到Token放到緩存。

有人說這不多此一舉?登錄系統發布下完事了!但再我看來,事情的結果並不重要,重要的是過程!

三個動作

首先,我們就要鑒權,拿到Token保存到緩存時,然后,選擇節點發布任務到對應的環境,最后再審核剛提交的任務。那么拆分下步驟如下!

1、授權Token

2、發布代碼

3、審核代碼

我相信程序員都對網頁三劍客多多少少都有點了解,網頁的基本構建,或者App頁面的基本構成,那么IDEA的插件也類似設計思想,只不過語言換了,實現過程不一樣!

Java寫GUI程序,我們要了解Java的基本工具類Swing,它是為Java設計的一個GUI工具包。它提供了很多基礎的組件:比如,文本框,按鈕,分隔窗格和表等。

界面編碼

SDK里DialogWrapper這個類給我們提供一個標准的頁面組件框架,我們實現這個類,大部分情況下我們實現這個類的一些方法即可。上面我們的組件幾乎都是基於這個類,不同的是只要實現不同組件即可!

編寫界面

/**
 * @author Savey
 * @date 2021/10/19 21:50
 */
public class LoginFormDialog extends DialogWrapper {

    private final Project project;

    /**
     * 文本框
     */
    private final JTextField userText = new JTextField(20);

    /**
     * 密碼框
     */
    private final JPasswordField passwordText = new JPasswordField(20);

    
    public LoginFormDialog(@Nullable Project project) {
        super(project);
        this.project = project;
        setTitle("授權登錄");
        setSize(350, 200);
        init();
    }

	
     /**
     * 核心方法、創建中間部分的UI面板、Jpanel 可以認為DIV 盒子模型
     */
    @Override
    protected @NotNull JComponent createCenterPanel() {
       final JPanel panel = new JPanel();
      	//緩存記錄
        PropertiesComponent cache = project.getService(PropertiesComponent.class);
        /* 布局部分我們這邊不多做介紹
         */
        panel.setLayout(null);

        // 創建 JLabel
        JLabel userLabel = new JLabel("Account  :");
        /* 這個方法定義了組件的位置。
         */
        userLabel.setBounds(40,30,80,25);
        panel.add(userLabel);

        /*
         * 創建文本域用於用戶輸入
         */
        userText.setBounds(140,30,165,25);
        userText.setText(cache.getValue("userName"));
        panel.add(userText);

        // 輸入密碼的文本域
        JLabel passwordLabel = new JLabel("Password:");
        passwordLabel.setBounds(40,60,80,25);
        panel.add(passwordLabel);

        /*
         * 這個類似用於輸入的文本域
         */
        passwordText.setBounds(140,60,165,25);
        passwordText.setText(cache.getValue("password"));
        panel.add(passwordText);

        return panel;
    }


    @Override
    protected void doOKAction() {
     			//這里點擊 OK 按鈕時動作,這里我們即將調用API獲取TOKEN,放入緩存!
      		
      		//表單驗證。。。。。
      
      		//這里和寫普通Java代碼一樣,創建Service,調用方法。
     
      	  //操作UI
    }

其實寫這個界面我也是寫了很久,參考了很多資料,主要參考W3C的教學,大致就這么個寫法!有點啰嗦!

其中遇到寫的難的就是 Table!調試了好久~~~

創建動作

接下來、再來創建一個動作,這個動作使得授權彈框在當前的IDEA彈出來!

New -> Plugin DevKit ->Action->OK

點擊OK后, IDEA自動的在 Plugin.xml里會生成以下代碼。

<actions>
  	<action popup="true" class="cn.qmai.idea.action.LoginDialogAction" text="授權Token" description="登陸Opms" id="loginDialogAction" />
<actions/>

一個<action>標簽表示一個Action動作。

/**
 * @author Savey
 * @date 2021/10/19 18:10
 */
public class LoginDialogAction extends AnAction {

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
      	//當前項目,IDEA是一個應用,一個應用可以打開多個項目(Project),Project對象即對應當前打開的項目。
        Project project = e.getProject();
        assert project != null;
      	// LoginFormDialog 實例
        DialogWrapper formDialogIns  =	new LoginDialogAction(project);
      	//顯示界面
        formDialogIns.show();
    }
}

把動作放到對應的菜單上

<actions>
       <action popup="true" class="cn.qmai.idea.action.LoginDialogAction" text="授權Token" description="登陸Opms" id="loginDialogAction" />
				
        //這里我建立了一個Group 我把Action都放到我這個Group里,然后把這個Group放到 ToolsMenu 上//
        <group popup="true" id="qmOmpsActionGroup" text="Opms助手" icon="QmOpmsIcons.QmOpmsMenuActions">
            <reference ref="loginDialogAction" />
            <add-to-group group-id="ToolsMenu" anchor="last" />
        </group>
</actions>

<Group>標簽見名思意是一組的意思,就是一組按鈕、一組動作!顯然我就把<action>標簽放到里面。和SpringBean.xml類似!

<add-to-group>標簽是把當前的標簽放到指定的Group上,我這里放到了ToolsMenu(IDEA的Toosl)上了,(至於系統其他的Group句子在官方是有介紹的,用到什么再看什么吧!),當然你也可以指定自定義的<action> 或者 <group>id

另外你也可能為每個Action添加快捷鍵、

<actions>
  <action popup="true" id="publishProject" class="cn.qmai.idea.action.PublishProjectAction" text="發布代碼" description="發布代碼">
            <keyboard-shortcut keymap="$default"
                               first-keystroke="shift ctrl I"/>
        </action>
</actions>

標簽<keyboard-shortcut>添加熱鍵,有可能會和系統沖突,可以到KeyMap里修改!

啟動

這個和IDEA上的用法一樣,點擊RUN即可,會打開一個內置的IDEA用於調試!DEBUG代碼和普通IDEA用法一樣,沒什么區別、

代碼目錄

還有很多知識點沒有放出來,不過這些東西完全夠寫一個簡單的插件了,有興趣的同學可以一起交流!由於代碼里集成了很多私密的東西,源碼就不放出來了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM