כתיבת תוספי Gradle בהתאמה אישית

מאמר זה הוא חלק מסדרה: • מבוא ל- Gradle

• נמלה מול מייבן מול גרדל

• כתיבת תוספי Gradle בהתאמה אישית (מאמר נוכחי) • יצירת צנצנת שומן ב- Gradle

1. הקדמה

Gradle הוא כלי בנייה פופולרי מאוד, אשר לעתים קרובות מוערך על תהליך הבנייה הניתן להתאמה אישית.

היום אנו נציג כיצד ליצור תוספי Gradle מותאמים אישית, שיאפשרו לנו לשנות את תהליך הבנייה מעבר למה שאנו יכולים להשיג בעזרת התצורה הסטנדרטית.

2. מיקום מקור התוסף

אנו יכולים למקם את הקוד שלנו בכמה מיקומים שונים. לכולם יש כמה יתרונות וחסרונות.

2.1. בנה סקריפט

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

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

2.2. BuildSrc תיקיה

אפשרות נוספת בה אנו יכולים להשתמש היא הצבת קוד המקור של התוסף שלנו ב- buildSrc / src / main / java תיקיה.

כאשר אתה מנהל את Gradle, זה יבדוק אם קיימת ה- buildSrc תיקיה. אם זה קיים, Gradle יבנה אוטומטית ויכלול את התוסף שלנו.

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

2.3. פרויקט עצמאי

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

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

3. התוסף הראשון שלנו

נתחיל מהיסודות - כל תוסף Gradle חייב ליישם את com.gradle.api.Plugin מִמְשָׁק.

הממשק הוא כללי, כך שנוכל לפרמטר אותו בעזרת סוגי פרמטרים שונים. בדרך כלל, סוג הפרמטר הוא org.gradle.api.Project.

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

  • באמצעות org.gradle.api.Settings יביא להחלת התוסף על סקריפט הגדרות
  • באמצעות org.gradle.api.Gradle יביא להחלת התוסף על סקריפט אתחול

התוסף הפשוט ביותר שנוכל ליצור הוא שלום עולם יישום:

בכיתה ציבורית GreetingPlugin מיישם את התוסף {@Override public void apply (Project Project) {project.task ("שלום") .doLast (task -> System.out.println ("Hello Gradle!")); }}

כעת אנו יכולים ליישם אותו על ידי הוספת שורה בתוך סקריפט הבנייה שלנו:

החל תוסף: GreetingPlugin

עכשיו, אחרי שהתקשר דרגה שלום, נראה "שלום דרדל" הודעה ביומנים.

4. תצורת התוסף

לרוב התוספים יהיה צורך בתצורה חיצונית מתסריט ה- build.

אנו יכולים לעשות זאת באמצעות אובייקטים של הרחבה:

מעמד ציבורי GreetingPluginExtension {private String greeter = "Baeldung"; הודעת מחרוזת פרטית = "הודעה מהתוסף!" // סטרים וקובעים סטנדרטיים}

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

@ ביטול חלל ציבורי החל (פרויקט פרויקט) {GreetingPluginExtension סיומת = project.getExtensions () .create ("ברכה", GreetingPluginExtension.class); project.task ("שלום") .doLast (משימה -> {System.out.println ("שלום," + extension.getGreeter ()); System.out.println ("יש לי הודעה בשבילך:" + סיומת .getMessage ());}); }

עכשיו, כשאנחנו מתקשרים דרגה שלום, נראה את הודעת ברירת המחדל המוגדרת ב- שלנו ברכה PluginExtension.

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

ברכה {greeter = "Stranger" הודעה = "הודעה מתסריט ה- build"}

5. פרויקט תוסף עצמאי

כדי ליצור תוספי Gradle עצמאיים, עלינו לעשות קצת יותר עבודה.

5.1. להכין

ראשית, עלינו לייבא את התלות ב- API של Gradle - שהיא די פשוטה:

תלות {הידור gradleApi ()}

שים לב כי לעשות את אותו הדבר ב- Maven דורש דרגה-נוסע-API תלות - ממאגר Gradle:

  org.gradle gradle-tooling-api 3.0 org.gradle gradle-core 3.0 סיפק repo.gradle.org //repo.gradle.org/gradle/libs-releases-local/ 

5.2. חיווט התוסף

כדי לאפשר ל- Gradle למצוא את היישום של התוסף העצמאי שלנו, עלינו ליצור את קובץ המאפיינים ב- src / main / resources / META-INF /דרגה-תוספים.

לקובץ המשאבים צריך להיות שם שתואם את מזהה התוסף. אז אם לתוסף שלנו יש מזהה org.baeldung.greeting, הנתיב המדויק של הקובץ יהיה META-INF / gradle-plugins / org.baeldung.greeting.properties.

לאחר מכן נוכל להגדיר את מחלקת ההטמעה של התוסף:

 יישום מחלקה = org.gradle.GreetingPlugin

ה מחלקת יישום צריך להיות שווה לשם החבילה המלא של מחלקת התוספים שלנו.

5.3. יצירת מזהה התוסף

ישנם כמה כללים ומוסכמות שעליהם למלא מזהה התוסף ב- Gradle. רובם דומים לכללי שם חבילה ב- Java:

  • הם יכולים להכיל רק תווים אלפא-נומריים, "." ו- “-“
  • המזהה צריך לכלול לפחות "." הפרדת שם התחום משם התוסף
  • מרחבי שמות org.gradle ו com.gradleware מוגבלים
  • מזהה לא יכול להתחיל או לסיים עם "."
  • אין שניים או יותר רצופים "." תווים מותרים

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

ההבדל העיקרי בין שמות חבילות Java לבין שמות תוספי Gradle הוא ששם החבילה בדרך כלל מפורט יותר מזהה התוסף.

5.4. תוסף פרסום

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

קוֹדֶם כֹּל, אנו יכולים לפרסם את התוסף JAR למאגר חיצוני כמו Maven אוֹ קִיסוֹס.

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

5.5. תוסף Java Gradle לפיתוח

כאשר אנו כותבים את התוספים שלנו ב- Java, אנו יכולים להפיק תועלת מה- תוסף Java Gradle לפיתוח.

זה יתאסף ויוסף אוטומטית gradleApi () תלות. זה יבצע גם אימות מטא-נתונים של תוספים כחלק מה- צנצנת דרדר מְשִׁימָה.

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

תוספים {id 'java-gradle-plugin'}

6. בדיקת תוספים

כדי לבדוק שהתוסף שלנו פועל כראוי והוא מוחל כראוי על ה- פּרוֹיֶקט, אנחנו יכולים להשתמש org.gradle.testfixtures.ProjectBuilder כדי ליצור מופע של פּרוֹיֶקט.

לאחר מכן נוכל לבדוק אם התוסף הוחל ומשימות נאותות קיימות אצלנו פּרוֹיֶקט למשל. אנחנו יכולים להשתמש בתקן JUnit בדיקות לעשות זאת:

@Test ציבורי מבוטל greetingTest () {Project project = ProjectBuilder.builder (). Build (); project.getPluginManager (). להחיל ("com.baeldung.greeting"); assertTrue (project.getPluginManager () .hasPlugin ("com.baeldung.greeting")); assertNotNull (project.getTasks (). getByName ("שלום")); }

7. סיכום

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

וכמו תמיד, ניתן למצוא את כל דוגמאות הקוד ב- Github.

הַבָּא » יצירת צנצנת שמנה בגרדל « נמלה קודמת מול מייבן מול גרדל