כתיבת תוספי IntelliJ IDEA באמצעות Gradle

1. הקדמה

במהלך השנים האחרונות, IntelliJ מ- JetBrains הפכה במהרה ל- IDE המוביל עבור מפתחי Java. בדו"ח האחרון של מדינת ג'אווה, IntelliJ הייתה ה- IDE הנבחרת עבור 61% מהנשאלים, לעומת 55% אשתקד.

תכונה אחת שהופכת את IntelliJ למושכת כל כך עבור מפתחי Java היא היכולת להרחיב וליצור פונקציונליות חדשה באמצעות תוספים.

במדריך זה נבחן כתיבת תוסף IntelliJ באמצעות הדרך המומלצת החדשה עם Gradle כדי להדגים כמה דרכים בהן אנו יכולים להרחיב את ה- IDE. מאמר זה הוא תערובת מחודשת של קודמת המתארת ​​את יצירתו של אותו תוסף באמצעות Devkit Plugin.

2. סוגי התוספים העיקריים

הסוגים הנפוצים ביותר של תוספים כוללים פונקציונליות עבור:

  • תמיכה בשפה מותאמת אישית: היכולת לכתוב, לפרש ולהרכיב קוד הכתוב בשפות שונות
  • שילוב מסגרות: תמיכה במסגרות צד שלישי כמו אביב
  • שילוב כלים: אינטגרציה עם כלים חיצוניים כגון Gradle
  • תוספות ממשק משתמש: פריטי תפריט חדשים, חלונות כלים, פסי התקדמות ועוד

תוספים ייכנסו לרוב למספר קטגוריות. לדוגמא, התוסף Git שנשלח עם IntelliJ מתקשר עם ה- git הפעלה המותקנת במערכת. התוסף מספק את חלון הכלים שלו ואת פריטי התפריט הקופץ, תוך שילוב בתהליך העבודה של יצירת הפרויקט, חלון ההעדפות ועוד.

3. צור תוסף

ישנן שתי דרכים נתמכות ליצירת תוספים. נשתמש בדרך המומלצת לפרויקטים חדשים עם Gradle במקום להשתמש ב- Devkit Plugin שלהם.

יצירת תוסף מבוסס Gradle נעשית באמצעות פרוייקט חדש תַפרִיט.

שים לב שעלינו לכלול את Java ואת תוסף הפלטפורמה IntelliJ כדי להבטיח ששיעורי התוספים הנדרשים זמינים בנתיב הכיתה.

נכון לכתיבת שורות אלה, אנו יכולים להשתמש ב- JDK 8 רק לצורך כתיבת תוספי IntelliJ.

4. תוסף לדוגמא

ניצור תוסף המספק גישה מהירה לאתר Stack Overflow הפופולרי ממספר אזורים ב- IDE. זה יכלול:

  • פריט בתפריט כלים לביקור בדף שאל שאלה
  • פריט בתפריט קופץ גם בעורך הטקסט וגם בפלט המסוף כדי לחפש טקסט מודגש ב- Stack Overflow

4.1. יצירת פעולות

פעולות הן הדרך הנפוצה ביותר לגשת לתוסף. פעולות מופעלות על ידי אירועים ב- IDE, כגון לחיצה על פריט תפריט או כפתור סרגל כלים.

השלב הראשון ביצירת פעולה הוא יצירת מחלקת Java שמתרחבת פעולה. עבור התוסף Stack Overflow שלנו, ניצור שתי פעולות.

הפעולה הראשונה פותחת את הדף שאל שאלה בחלון דפדפן חדש:

מחלקה ציבורית AskQuestionAction מרחיב את AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browser ("// stackoverflow.com/questions/ask"); }}

אנו משתמשים במובנה BrowserUtil בכיתה לטיפול בכל הניואנסים של פתיחת דף אינטרנט במערכות הפעלה ודפדפנים שונים.

אנו זקוקים לשני פרמטרים כדי לבצע חיפוש ב- StackOverflow: תג השפה והטקסט לחיפוש.

כדי להשיג את תג השפה, נשתמש בממשק מבנה התוכנית (PSI). ממשק API זה מנתח את כל הקבצים בפרויקט ומספק דרך תוכנתית לבדוק אותם.

במקרה זה אנו משתמשים ב- PSI כדי לקבוע את שפת התכנות של קובץ:

PsiFile אופציונלי = Optional.ofNullable (e.getData (LangDataKeys.PSI_FILE)); מחרוזת languageTag = psiFile.map (PsiFile :: getLanguage) .map (שפה :: getDisplayName) .map (מחרוזת :: toLowerCase) .map (lang -> "[" + lang + "]") .orElse ("") ;

כדי לקבל את הטקסט לחיפוש, נשתמש ב- עוֹרֵך ממשק API לאחזור טקסט מודגש על המסך:

עורך עורך = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); מחרוזת selectedText = caretModel.getCurrentCaret (). GetSelectedText ();

למרות שפעולה זו זהה גם לחלונות העורך וגם לחלונות המסוף, הגישה לטקסט שנבחר פועלת באותה צורה.

עכשיו, נוכל להרכיב את כל זה פעולה בוצעה הַצהָרָה:

@ ביטול פעולה בטלנית ציבורית מבוטלת (@NotNull AnActionEvent e) {Optional psiFile = Optional.ofNullable (e.getData (LangDataKeys.PSI_FILE)); מחרוזת languageTag = psiFile.map (PsiFile :: getLanguage) .map (שפה :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + lang + "]") .orElse ("") ; עורך עורך = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); מחרוזת selectedText = caretModel.getCurrentCaret (). GetSelectedText (); BrowserUtil.browser ("// stackoverflow.com/search?q=" + languageTag + textText); }

פעולה זו עוקפת גם שיטה שנייה בשם עדכון, המאפשר לנו להפעיל או להשבית את הפעולה בתנאים שונים. במקרה זה, אנו משביתים את פעולת החיפוש אם אין טקסט נבחר:

עורך עורך = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ());

4.2. רישום פעולות

ברגע שכתבנו את הפעולות שלנו, עלינו לרשום אותם ב- IDE. ישנן שתי דרכים לעשות זאת.

הדרך הראשונה היא שימוש ב- plugin.xml קובץ, שנוצר עבורנו כאשר אנו מתחילים פרויקט חדש.

כברירת מחדל, הקובץ יהיה ריק אלמנט, שם נוסיף את הפעולות שלנו:

שימוש בקובץ XML לרישום פעולות יבטיח שהם יירשמו במהלך אתחול IDE, מה שבדרך כלל עדיף.

הדרך השנייה לרישום פעולות היא באמצעות תכנות ActionManager מעמד:

ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", SearchAction חדש ());

זה יתרון בכך שהוא מאפשר לנו לרשום פעולות באופן דינמי. לדוגמא, אם אנו כותבים תוסף לשילוב עם ממשק API מרוחק, ייתכן שנרצה לרשום מערך פעולות אחר בהתבסס על גרסת ה- API שאליה אנו קוראים.

החיסרון בגישה זו הוא שפעולות אינן נרשמות בעת ההפעלה. עלינו ליצור מופע של ApplicationComponent לניהול פעולות, שדורש יותר קידוד ותצורת XML.

5. בדיקת התוסף

כמו בכל תוכנית, כתיבת תוסף IntelliJ מחייבת בדיקה. עבור תוסף קטן כמו זה שכתבנו, זה מספיק כדי להבטיח שהתוסף אוסף ושהפעולות שיצרנו יעבדו כצפוי כשאנחנו לוחצים עליהם.

אנו יכולים לבדוק (ולפתור באגים) באופן ידני את התוסף שלנו על ידי פתיחת חלון הכלים של Gradle וביצוע ה- runIde מְשִׁימָה:

פעולה זו תשיק מופע חדש של IntelliJ עם הפעלת התוסף שלנו. פעולה זו מאפשרת לנו ללחוץ על פריטי התפריט השונים שיצרנו ולהבטיח שנפתחים דפי Stack Overflow.

אם ברצוננו לבצע בדיקות יחידה מסורתיות יותר, IntelliJ מספקת סביבה ללא ראש להפעלת בדיקות יחידות. אנו יכולים לכתוב מבחנים באמצעות כל מסגרת בדיקה שנרצה, והבדיקות מתבצעות באמצעות רכיבים אמיתיים ולא מעוקבים מה- IDE.

6. פריסת התוסף

תוסף Gradle מספק דרך פשוטה לארוז תוספים כדי שנוכל להתקין ולהפיץ אותם. כל שעליך לעשות הוא לפתוח את חלון כלי Gradle ולהפעיל את buildPlugin מְשִׁימָה. פעולה זו תיצור קובץ ZIP בתוך ה- בנייה / הפצות מַדרִיך.

קובץ ה- ZIP שנוצר מכיל את קוד וקבצי התצורה הדרושים לטעינה ב- IntelliJ. אנו יכולים להתקין אותו באופן מקומי, או לפרסם אותו במאגר תוספים לשימושם של אחרים.

צילום המסך שלמטה מציג את אחד מפריטי התפריט החדש של Stack Overflow בפעולה:

7. מסקנה

במאמר זה פיתחנו תוסף פשוט המדגיש כיצד נוכל לשפר את ה- IntelliJ IDE.

אמנם אנו עובדים בעיקר עם פעולות, אך ה- SDK של תוסף IntelliJ מציע מספר דרכים להוסיף פונקציונליות חדשה ל- IDE. לקריאה נוספת, עיין במדריך התחלת העבודה הרשמי שלהם.

כמו תמיד, ניתן למצוא את הקוד המלא של תוסף הדוגמה שלנו ב- GitHub.