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.