IntelliJ IDEA bővítmények írása a Gradle használatával

1. Bemutatkozás

Az elmúlt néhány évben a JetBrains IntelliJ-je gyorsan a legjobb fejlesztői IDE lett. Legutóbbi Java állapot jelentésünkben az IntelliJ volt a választott IDE a válaszadók 61% -ánál, szemben az előző évi 55% -kal.

Az egyik olyan tulajdonság, amely annyira vonzóvá teszi az IntelliJ-t a Java fejlesztők számára, az a bővítmények használatának bővítése és új funkciók létrehozása.

Ebben az oktatóanyagban megvizsgáljuk, hogyan írhatunk egy IntelliJ plugint az új, ajánlott módon a Gradle-lel, hogy bemutassuk az IDE kiterjesztésének néhány módját. Ez a cikk egy korábbi keveréke, amely leírja ugyanazon plugin létrehozását a Plugin Devkit segítségével.

2. A bővítmények fő típusai

A leggyakoribb beépülő modulok a következők funkcióit tartalmazzák:

  • Egyéni nyelvi támogatás: a különböző nyelveken írt kód írásának, értelmezésének és összeállításának képessége
  • Keretintegráció: harmadik féltől származó keretek támogatása, mint például a Spring
  • Eszközintegráció: integráció olyan külső eszközökkel, mint a Gradle
  • A felhasználói felület kiegészítői: új menüpontok, eszközablakok, folyamatjelző sávok és egyebek

A beépülő modulok gyakran több kategóriába sorolhatók. Például az IntelliJ-vel szállított Git plugin kölcsönhatásba lép az git a rendszerre telepített futtatható fájl. A beépülő modul biztosítja az eszközablakot és a felugró menüelemeket, ugyanakkor integrálódik a projekt létrehozásának munkafolyamatába, a beállítások ablakába és egyebekbe is.

3. Hozzon létre egy beépülő modult

A bővítmények létrehozásának két támogatott módja van. A Gradle új projektjeinek ajánlott módját a Plugin Devkit helyett használjuk.

A Gradle-alapú plugin létrehozása a Új> Projekt menü.

Ne feledje, hogy tartalmaznia kell a Java-t és az IntelliJ Platform beépülő modult annak biztosítása érdekében, hogy a szükséges plugin osztályok elérhetőek legyenek az osztályúton.

Az írás kezdetén csak a JDK 8-at használhatjuk az IntelliJ bővítmények írásához.

4. Példa beépülő modulra

Létrehozunk egy plugint, amely gyors hozzáférést biztosít a népszerű Stack Overflow webhelyhez az IDE több területéről. A következőket tartalmazza:

  • az Eszközök menüpont segítségével keresse fel a Kérdés feltevését oldalt
  • egy felugró menüpont mind a szövegszerkesztőben, mind a konzol kimenetében a kiemelt szöveg Stack Overflow keresésére szolgál

4.1. Műveletek létrehozása

A műveletek a plugin elérésének leggyakoribb módja. A műveleteket az IDE eseményei váltják ki, például egy menüelemre vagy egy eszköztár gombra kattintva.

A művelet létrehozásának első lépése egy kiterjesztő Java osztály létrehozása Egy bevetés. A Stack Overflow bővítményünkhöz két műveletet hozunk létre.

Az első művelet megnyitja a Kérdés feltevése oldalt egy új böngészőablakban:

public class AskQuestionAction kiterjeszti az AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browse ("// stackoverflow.com/questions/ask"); }}

A beépítettet használjuk BrowserUtil osztály kezeli a weblap különböző operációs rendszereken és böngészőkben történő megnyitásának minden árnyalatát.

Két paraméterre van szükségünk a kereséshez a StackOverflow-n: a nyelvi címke és a keresendő szöveg.

A nyelvi címke megszerzéséhez a Program Structure Interface-t (PSI) fogjuk használni. Ez az API elemzi a projekt összes fájlját, és programozott módon biztosítja azok ellenőrzését.

Ebben az esetben a PSI-t használjuk a fájl programozási nyelvének meghatározásához:

Opcionális psiFile = Opcionális.Nullable (e.getData (LangDataKeys.PSI_FILE)); Karakterlánc languageTag = psiFile.map (PsiFile :: getLanguage) .map (Nyelv :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + "lang +"] ") .orElse (" ") ;

A keresni kívánt szöveg használatához a Szerkesztő API a kijelölt szöveg lekéréséhez a képernyőn:

Szerkesztőszerkesztő = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); String selectedText = caretModel.getCurrentCaret (). GetSelectedText ();

Annak ellenére, hogy ez a művelet mind a szerkesztő, mind a konzol ablakban megegyezik, a kiválasztott szöveg elérése ugyanúgy működik.

Most mindezt össze tudjuk rakni egy actionPerformed nyilatkozat:

@Orride public void actionPerformed (@NotNull AnActionEvent e) {Opcionális psiFile = Optional.ofNullable (e.getData (LangDataKeys.PSI_FILE)); Karakterlánc languageTag = psiFile.map (PsiFile :: getLanguage) .map (Nyelv :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + "lang +"] ") .orElse (" ") ; Szerkesztőszerkesztő = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); String selectedText = caretModel.getCurrentCaret (). GetSelectedText (); BrowserUtil.browse ("// stackoverflow.com/search?q=" + languageTag + selectedText); }

Ez a művelet felülír egy második elnevezett módszert is frissítés, amely lehetővé teszi számunkra a művelet engedélyezését vagy letiltását különböző feltételek mellett. Ebben az esetben letiltjuk a keresési műveletet, ha nincs kiválasztott szöveg:

Szerkesztőszerkesztő = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ());

4.2. Műveletek regisztrálása

Miután megírtuk a tetteinket, regisztrálnunk kell őket az IDE-nél. Ennek kétféle módja van.

Az első módszer a plugin.xml fájl, amelyet akkor hozunk létre, amikor új projektet indítunk.

Alapértelmezés szerint a fájl üres lesz elem, amelyhez hozzáadjuk a műveleteinket:

Az XML fájl használata a műveletek regisztrálásához biztosítja, hogy az IDE indításakor regisztráljanak, ami általában előnyösebb.

A műveletek regisztrálásának második módja a ActionManager osztály:

ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", új SearchAction ());

Ennek az az előnye, hogy dinamikusan regisztrálhatjuk a műveleteket. Például, ha egy beépülő modult írunk egy távoli API-val való integrációhoz, akkor érdemes egy másik műveletkészletet regisztrálni az API általunk hívott verziója alapján.

Ennek a megközelítésnek az a hátránya, hogy az indításkor a műveletek nem regisztrálódnak. Létre kell hoznunk a ApplicationComponent műveletek kezelése, amely több kódolást és XML-konfigurációt igényel.

5. A beépülő modul tesztelése

Mint minden programnál, az IntelliJ bővítmény írásához is tesztelni kell. Az általunk írthoz hasonló kis pluginhoz elegendő biztosítani a beépülő modul fordítását, és hogy az általunk létrehozott műveletek a várakozásoknak megfelelően működnek, amikor rájuk kattintunk.

Manuálisan tesztelhetjük (és hibakereshetjük) a beépülő modulunkat a Gradle eszköz ablakának megnyitásával és a runIde feladat:

Ez elindítja az IntelliJ új példányát, aktiválva a beépülő modulunkat. Ez lehetővé teszi számunkra, hogy rákattintsunk az általunk létrehozott különböző menüelemekre, és biztosítsuk a megfelelő Stack Overflow oldalak megnyílását.

Ha hagyományosabb egységvizsgálatot akarunk végezni, az IntelliJ fejetlen környezetet biztosít az egységtesztek futtatásához. Teszteket írhatunk bármilyen tetszőleges keretrendszer segítségével, és a tesztek az IDE valós, gúnyolatlan komponenseinek felhasználásával futnak.

6. A beépülő modul telepítése

A Gradle plugin egyszerű módot kínál a beépülő modulok csomagolására, így telepíteni és terjeszteni tudjuk őket. Egyszerűen nyissa meg a Gradle eszközablakot, és hajtsa végre a buildPlugin feladat. Ez létrehoz egy ZIP fájlt a build / disztribúciók Könyvtár.

A létrehozott ZIP fájl tartalmazza az IntelliJ-be való betöltéshez szükséges kódot és konfigurációs fájlokat. Telepíthetjük helyileg, vagy közzétehetjük egy plugin tárolóban mások számára.

Az alábbi képernyőképen látható az egyik új Stack Overflow menüelem:

7. Következtetés

Ebben a cikkben kifejlesztettünk egy egyszerű plugint, amely kiemeli, hogyan javíthatjuk az IntelliJ IDE-t.

Míg elsősorban műveletekkel dolgozunk, az IntelliJ plugin SDK számos lehetőséget kínál az új funkciók hozzáadásához az IDE-hez. További olvasmányért olvassa el hivatalos kezdési útmutatójukat.

Mint mindig, a plugin mintánk teljes kódja megtalálható a GitHub oldalon.