מבוא ל- Gradle

מאמר זה הוא חלק מסדרה: • מבוא ל- Gradle (מאמר נוכחי) • Ant vs Maven vs Gradle

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

• יצירת צנצנת שמנה ב- Gradle

1. סקירה כללית

Gradle היא מערכת ניהול בנייה מבוססת Groovy שתוכננה במיוחד לבניית פרויקטים מבוססי Java.

הוראות התקנה ניתן למצוא כאן.

2. אבני בניין - פרויקטים ומשימות

ב- Gradle, Builds מורכבים מפרויקט אחד או יותר וכל פרויקט מורכב ממשימה אחת או יותר.

פרויקט ב- Gradle יכול להרכיב א קַנקַן, מִלחָמָה או אפילו א רוכסן קוֹבֶץ.

משימה היא יצירה יחידה. זה יכול לכלול קומפילציה של שיעורים או יצירה ופרסום של ארכיוני Java / אינטרנט.

ניתן להגדיר משימה פשוטה כ:

משימה שלום {doLast {println 'Baeldung'}}

אם נבצע את המשימה לעיל באמצעות דרגה -ש שלום פקודה מאותו מיקום שבו build.gradle מתגורר, עלינו לראות את הפלט במסוף.

2.1. משימות

סקריפטים לבנות של גרדל אינם אלא גרובי:

משימה למטה {doLast {String someString = 'שלום מ BAELDUNG' println "מקורי:" + someString println "אותיות קטנות:" + someString.toLowerCase ()}}

אנו יכולים להגדיר משימות התלויות במשימות אחרות. ניתן להגדיר תלות במשימה על ידי העברת ה- תלוי On: taskName טיעון בהגדרת משימה:

משימה שלום גראדל {doLast {println 'שלום דרדל!' }} משימה מ Baeldung (תלוי On: helloGradle) {doLast {println "אני מ Baeldung"}}

2.2. הוספת התנהגות למשימה

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

משימה helloBaeldung {doLast {println 'אני יבוצע שני'}} helloBaeldung.doFirst {println 'אני יבוצע ראשון'} helloBaeldung.doLast {println 'אני יוצא להורג שלישי'} helloBaeldung {doLast {println 'אני אהיה הוצא להורג רביעי '}}

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

2.3. הוספת מאפייני משימה

אנו יכולים גם להגדיר מאפיינים:

המשימה ourTask {ext.theProperty = "theValue"} 

הנה, אנחנו קובעים "הערך" כפי ש הרכוש של ה המשימה שלנו מְשִׁימָה.

3. ניהול תוספים

ישנם שני סוגים של תוספים ב- Gradle - תַסרִיט, ו בינארי.

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

פותרים פירושו למצוא את הגרסה הנכונה של צנצנת התוסף ולהוסיף אותה ל- מסלול כיתה של הפרויקט.

מגיש בקשה תוספים מבוצעת Plugin.apply (T)על הפרוייקט.

3.1. החלת תוספי סקריפט

בתוך ה aplugin.gradle, אנו יכולים להגדיר משימה:

משימה מ- Plugin {doLast {println "אני מהתוסף"}}

אם אנו רוצים להחיל תוסף זה על הפרויקט שלנו build.gradle קובץ, כל שעלינו לעשות הוא להוסיף שורה זו לקובץ שלנו build.gradle:

הגש בקשה מ: 'aplugin.gradle' 

עכשיו, מבצע משימות מדרגות הפקודה צריכה להציג את מ- Plugin משימה ברשימת המשימות.

3.2. החלת תוספים בינאריים באמצעות תוספי DSL

במקרה של הוספת תוסף ליבה בינארי, אנו יכולים להוסיף שמות קצרים או מזהה תוסף:

תוספים {id 'application'}

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

תוספים {id "org.shipkit.bintray" גרסה "0.9.116"}

עַכשָׁיו, Shipkit המשימות צריכות להיות זמינות ב משימות מדרגות רשימה.

המגבלות של תוספי ה- DSL הן:

  • זה לא תומך בקוד גרובי בתוך ה- תוספים לַחסוֹם
  • תוספים בלוק צריך להיות הצהרה ברמה העליונה בסקריפטים של הפרויקט (רק תבניות בנייה {} מותר לחסום לפני זה)
  • לא ניתן לכתוב תוספי DSL בתוסף סקריפטים, settings.gradle קובץ או בתסריטים init

תוספי DSL עדיין מדגרים. תצורת ה- DSL ותצורה אחרת עשויות להשתנות בגרסאות ה- Gradle המאוחרות יותר.

3.3. נוהל מורשת להחלת תוספים

אנו יכולים גם ליישם תוספים באמצעות "החל תוסף":

החל תוסף: 'מלחמה'

אם עלינו להוסיף תוסף קהילתי, עלינו להוסיף את הצנצנת החיצונית אל שביל הכיתה באמצעות buildscript {} לַחסוֹם.

לאחר מכן, אנחנו יכולים להחיל את התוסף בסקריפטים לבנות אבלרק אחרי כל קיים תוספים {} לַחסוֹם:

buildscript {repositories {maven {url "//plugins.gradle.org/m2/"}} תלות {classpath "org.shipkit: shipkit: 0.9.117"}} החל תוסף: "org.shipkit.bintray-release"

4. ניהול תלות

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

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

4.1. תצורת תלות

תלות מקובצות בתצורות שונות. לתצורה יש שם והם יכולים להאריך זה את זה.

אם אנו מיישמים את תוסף Java, יהיה לנו compile, testCompile, runtime תצורות זמינות לקיבוץ התלות שלנו. ה ברירת מחדל גתצורה מתרחבת "זמן ריצה ”.

4.2. הכרזת תלות

בואו נסתכל על דוגמה להוספת תלות (Spring and Hibernate) תוך שימוש בכמה דרכים שונות:

תלות {קבוצת קומפילציה: 'org.springframework', שם: 'core-core', גרסה: '4.3.5.RELEASE' compile 'org.springframework: spring-core: 4.3.5.RELEASE', 'org.springframework: spring-aop: 4.3.5.RELEASE 'קומפילציה ([קבוצה:' org.springframework ', שם:' spring-core ', גרסה:' 4.3.5.RELEASE '], [group:' org.springframework ', שם : 'spring-aop', גרסה: '4.3.5.RELEASE']) testCompile ('org.hibernate: hibernate-core: 5.2.12.Final') {transitive = true} זמן ריצה (קבוצה: 'org.hibernate' , שם: 'ליבת שינה', גרסה: '5.2.12.Final') {transitive = false}}

אנו מכריזים על תלות בתצורות שונות: לְלַקֵט, testCompile, ו זמן ריצה בפורמטים שונים.

לפעמים אנו זקוקים לתלות שיש בהן חפצים מרובים. במקרים כאלה, אנו יכולים להוסיף סימני חפץ בלבד @ ExtensionName (אוֹ שלוחה בצורה מורחבת) להורדת החפץ הרצוי:

זמן ריצה "org.codehaus.groovy: groovy-all: [דוא"ל מוגן]" קבוצת זמן ריצה: 'org.codehaus.groovy', שם: 'groovy-all', גרסה: '2.4.11', שלוחה: 'jar'

הנה, הוספנו את @קַנקַן סימון להורדת חפץ הצנצנת בלבד ללא התלות.

כדי להוסיף תלות לקבצים מקומיים כלשהם, נוכל להשתמש במשהו כזה:

הידור קבצים ('libs / joda-time-2.2.jar', 'libs / junit-4.12.jar') הידור קובץ Tree (דיר: 'libs', כולל: '* .jar')

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

תצורות {testCompile.exclude module: 'junit'} testCompile ("org.springframework.batch: spring-batch-test: 3.0.7. RELEASE") {exclude module: 'junit'}

5. בנייה מרובת פרויקטים

5.1. בנה מחזור חיים

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

זה מוזכר בדרך כלל ב settings.gradle קובץ, שנמצא בשורש הפרויקט. Gradle יוצר גם מקרים של הפרויקטים המשתתפים.

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

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

סוף כל סוף, בשלב הביצוע מבוצעת קבוצת משנה של משימות, שנוצרו והוגדרו. אנו יכולים לכלול קוד ב- settings.gradle ו build.gradle קבצים כדי לתפוס את שלושת השלבים הללו.

ב settings.gradle :

println 'בשלב האתחול.'

ב build.gradle :

println 'בשלב התצורה.' המשימה מוגדרת {println 'גם בשלב התצורה.' } משימה execFirstTest {doLast {println 'בשלב הביצוע.' }} משימה execSecondTest {doFirst {println 'בהתחלה בשלב הביצוע.' } doLast {println 'סוף סוף בשלב הביצוע.' } println 'בשלב התצורה.' }

5.2. יצירת Build-Multi-Project

אנחנו יכולים לבצע את init דרגה פקודה בתיקיית הבסיס כדי ליצור שלד לשניהם settings.gradle ו build.gradle קוֹבֶץ.

כל התצורה הנפוצה תישמר בסקריפט ה- root build:

allprojects {repositories {mavenCentral ()}} subprojects {version = '1.0'}

קובץ ההגדרה צריך לכלול את שם פרוייקט השורש ואת שם פרויקט המשנה:

rootProject.name = 'multi-project-builds' כולל 'ספריית ברכה', 'מברך'

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

אם נרצה לקבל את שלנו מברך הפרויקט תלוי ב- ברכה-ספרייה, עלינו לכלול את התלות בסקריפט הבנייה של מברך:

תלות {compile project (': greeting-library')}

6. שימוש בעטיפת Gradle

אם יש פרויקט של Gradle מדרדר קובץ עבור Linux ו- gradlew.bat קובץ עבור Windows, אנחנו לא צריכים להתקין את Gradle כדי לבנות את הפרויקט.

אם נבצע מדרדר לִבנוֹת ב- Windows ו- ./gradlew לבנות ב- Linux, הפצת Gradle שצוינה ב- מדרדר הקובץ יורד אוטומטית.

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

עטיפת מדרגות - גרסת גרסה 4.2.1

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

עטיפת משימות (סוג: עטיפה) {gradleVersion = '4.2.1'}

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

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

7. מסקנה

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

קוד המקור של מאמר זה זמין באתר GitHub.

הַבָּא » נמלה מול מייבן מול גרדל