JavaRush /בלוג Java /Random-HE /היכרות מהירה עם Gradle
Viacheslav
רָמָה

היכרות מהירה עם Gradle

פורסם בקבוצה

מבוא

הנושא של סקירה זו יהיה מערכת הבנייה האוטומטית של Gradle. באנגלית, מערכות בנייה נקראות Build Tools . היכרות מהירה עם Gradle - 1למה זה בכלל נחוץ? בנייה ידנית של פרויקטים בג'אווה היא תהליך עתיר עבודה למדי. יש צורך לציין בצורה נכונה את הספריות והמסגרות שהפרויקט זקוק להן ובהן תלוי הפרויקט. כאן אתה יכול לקרוא מאמר מצוין על Habré: " עבודה עם Java בשורת הפקודה ." במוקדם או במאוחר תתחיל ליצור כמה סקריפטים כדי להפוך תהליך זה לאוטומטי. עכשיו תארו לעצמכם שכל המפתחים ברחבי העולם עושים זאת וכולם כותבים שוב את מה שמישהו כבר כתב עבור הפרויקט שלהם. ואז הופיעו מערכות הרכבה של פרויקטים שהופכות את התהליך הזה לאוטומטיות. בנוסף, מצד אחד הם מאפשרים לכם להרכיב פרויקט כמו שאתם רוצים, מצד שני מספקים לכם כלים פחות או יותר סטנדרטיים. חלופה ל- Gradle היא מערכת הבנייה האוטומטית של Maven. שתי מערכות ההרכבה הללו הן, מצד אחד, שונות, אך מצד שני, יש להן מספר קווי דמיון. קיים חומר בנושא זה באתר Gradle: " הגירה ממייבן לגריידל ". כפי שצוין במדריך זה, ל- Gradle ול-Maven יש פרספקטיבה שונה לגבי איך לבנות פרויקט. Gradle מבוסס על גרף של משימות, שיכולות להיות תלויות זו בזו. משימות עושות סוג של עבודה. מייבן משתמשת במודל של שלבים מסוימים, שאליהם מחוברות "מטרות" מסוימות. מטרות אלו הן המקום שבו נעשית עבודה מסוימת. עם זאת, עם הגישות השונות הללו, שתי מערכות הבנייה עוקבות אחר אותה מוסכמה וניהול התלות דומה. כדי להתחיל להשתמש ב- Gradle אתה צריך להוריד אותו. בגוגל או Yandex אנו נכנסים ל-"Gradle Build Tool" ובתוצאות הראשונות אנו רואים את האתר הרשמי: https://gradle.org . בדף Gradle הראשי יש קישור עם הטקסט "Docs", שמוביל לתיעוד Gradle . ראשית, עלינו להתקין (התקן) Gradle, אז אנו מעוניינים בסעיף " התקנת Gradle " בתיעוד. ישנן שיטות התקנה רבות, כולל שיטת ה"מיושן", כלומר. באופן ידני (" התקנה ידנית "). לפי ההוראות, הורד קובץ מסוג " בינארי בלבד ", שיהיה לו שם כמו gradle-5.1.1-bin.zip. לאחר מכן, פרק את הארכיון והגדר את משתנה הסביבה PATH בהתאם להוראות. העיקר הוא שלאחר ביצוע ההוראות, הפקודה gradle -vמציגה את הגרסה של Gradle המותקן. תיתכן בעיה שבעת קביעת המיקום, המערכת תמצא את Gradle לא היכן שאתה רוצה. לכן, ב-Windows אתה יכול לעשות (ב-nix יש אנלוגים): for %i in (gradle.bat) do @echo. %~$PATH:i עכשיו, אולי, אנחנו יכולים להתחיל להכיר.
היכרות מהירה עם Gradle - 2

אתחול פרויקט Gradle

ברצוני לציין מיד שגרדל עוסק בביצוע משימות שנקראות משימות (אקרא להן משימות). המשימות מסופקות על ידי תוספים שונים . אני ממליץ לך לקרוא עוד על תוספים בתיעוד הרשמי: " שימוש בתוספים של Gradle ". יש קבוצה של "תוספי ליבה" שתמיד זמינים כאשר Gradle מותקן. ישנן קטגוריות שונות של תוספים אלה, אך אנו מעוניינים בקטגוריית " כלי שירות ". ערכה זו כוללת את הפלאגין " Build Init Plugin ", המספק משימות לאתחול פרויקט Gradle. אנו מעוניינים ליצור סוג פרויקט: " java-application ". בואו נריץ את משימת Gradle: gradle init --type java-application בואו נענה על כמה שאלות בדרך, למשל, שאנחנו רוצים להשתמש ב-Groovy DSL (שפת תיאור משימות סטנדרטית עבור Gradle) ובמסגרת הבדיקות של JUnit (נדבר על זה בסקירה אחרת). לאחר היצירה נקבל את קבוצת הקבצים הבאה:
היכרות מהירה עם Gradle - 3
ראשית, לאחר האתחול אנו מקבלים מעטפת מיוחדת שהוגדרה מראש לגרסה שלנו של Gradle - זהו סקריפט מיוחד. אני ממליץ לך לקרוא עוד על זה בתיעוד הרשמי - " העטיפה של Gradle ". שנית, אנו רואים את ה-Gradle Build Script - הקובץ build.gradle. זהו הקובץ הראשי, המתאר באילו ספריות ומסגרות משתמש הפרויקט שלנו, אילו פלאגינים צריכים להיות מחוברים לפרויקט ומתאר משימות שונות. אני ממליץ לך לקרוא עוד על קובץ זה בתיעוד הרשמי: " Build Script Basics ".
היכרות מהירה עם Gradle - 4

תוספים ומשימות

אם נסתכל כעת על התוכן של Build Script, נראה את קטע התוספים:
plugins {
    id 'java'
    id 'application'
}
אלו אותם תוספים שדיברנו עליהם קודם. ואם יש תוספים, אז יש משימות שזמינות לנו כעת. אנחנו יכולים להפעיל את פקודת המשימות Gradle ולראות מה אנחנו יכולים לעשות כעת עם הפרויקט:
היכרות מהירה עם Gradle - 5
לדוגמה, על ידי ביצוע gradle runנשיק את המחלקה הראשית של אפליקציית ה-Java שלנו:
היכרות מהירה עם Gradle - 6
כפי שאנו יכולים לראות, אותו הדבר כתוב להלן.מה 2 actionable tasks: 1 executed, 1 up-to-date זה אומר? המשמעות היא שסך הכל הושלמו 2 משימות: יתרה מכך, אחת הושלמה בפועל, ואחת לא בוצעה, כי... היא מעודכנת, כלומר המדינה עדכנית ולא נעשה דבר. נוכל לבצע את מה שנקרא "הרצה יבשה": gradle run -m בוא נבצע את הפקודה הזו, נראה אילו משימות יבוצעו כדי לבצע את משימת הריצה:
היכרות מהירה עם Gradle - 7
כפי שאנו יכולים לראות, סה"כ הושלמו 4 משימות: לפני ביצוע הריצה, היא ביצעה את מחלקות משימות התלות. למחלקות עצמן יש 2 תלות ולכן היא גם ביצעה compileJava ו-procesResources. כאשר אנו מבצעים משימה, אנו יכולים לבצע אותה תוך צפייה ברמה מסוימת של יומנים (רמת הרישום קובעת כמה חשובות ההודעות נרצה לראות). לדוגמה, אנחנו יכולים לעשות gradle run -i. זה גם יציג לנו הודעות מידע כמו:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
למידע נוסף על התחברות ב- Gradle, אני ממליץ לך לעיין בתיעוד הרשמי: " Gradle Logging ". כפי שאנו יכולים לראות, משימת המחלקות דילגה כי היא עדכנית , כלומר, המצב עדכני, אין צורך לעשות דבר, אז לא היו פעולות. הסיבה לכך היא שבברירת המחדל יש ל-Gradle " בדיקות עדכניות " או מה שנקרא בנייה מצטברת. אתה יכול לקרוא עוד על מנגנון זה בתיעוד Gradle: " בדיקות עדכניות (AKA Incremental Build) ". אבל ניתן להשבית את המנגנון הזה על ידי ביצוע משימה המציינת את הדגל --rerun-tasks. לדוגמה, gradle run --rerun-tasks. לאחר מכן נראה: 2 משימות ניתנות לפעולה: 2 מבוצעות כפי שאתה יכול לראות, מספר המשימות המבוצעות לוקח בחשבון רק את הרמה הראשונה של הגרף, כלומר, משימת הריצה עצמה והמשימות שבהן היא תלויה ישירות, כלומר , שיעורים. משימות שבהן תלויות מחלקות אינן נספרות כאן (למרות שהן מבוצעות כאשר משימת המחלקות מבוצעת). כדאי לקרוא גם על המשימות:
היכרות מהירה עם Gradle - 8

תלות

אחת המשימות העיקריות של כל מערכת בנייה היא ניהול תלות, כלומר אילו ספריות/מסגרות זקוקות לפרויקט שלנו. מערכת הבנייה חייבת להבטיח שהם זמינים בזמן הנכון ולהרכיב את החפץ הסופי של האפליקציה שלנו בצורה הנכונה. כברירת מחדל, לאחר gradle init עבור java-application, נראה את התוכן הבא בסקריפט ה-build:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
כאן ברור מיד מה אנחנו מחברים. אבל ללא הבנה מסוימת, לא ברור מה הם יישום ו-testImplementation? כאן עלינו לפנות שוב לתיעוד גרדל, שכן התיעוד של גרדל כתוב היטב. זה נקרא " ניהול תצורות תלות ". כאמור בתיעוד, כל תלות מוכרזת בהיקף מסוים - התחום שבתוכו תהיה תלות זו. היקף זה מוגדר על ידי תצורה כלשהי, שלכל אחת מהן יש שם ייחודי. זה גם מעניין שתוספי Gradle רבים מוסיפים תצורות מוגדרות מראש. כדי לגלות אילו תצורות יש לנו נוכל להריץ: gradle --console plain dependencies כך נראה רשימה של כל התצורות הזמינות והתלות שלהן. נוכל לסנן רשימה זו כך שנראה רק את התצורות הזמינות עצמן: gradle --console plain dependencies | find " - " איך נדע במה להשתמש? תצטרך לקרוא קצת כאן. כי אנו משתמשים בתוסף "Java", אז נתחיל בתיעוד שלו ובסעיף " ניהול תלות ". כאן אנו רואים שבעבר הייתה תצורה (המכונה היקף) שנקראת "קומפילציה" ומשמעותה הייתה "תלות הדרושה במהלך ההידור". אבל אז זה הוחלף (באנגלית Superseded) ביישום. תוכל לקרוא עוד על החלפה בסעיף " הפרדת API והטמעה ". מסתבר שהתלות הזו תהיה ב-"compile classpath". אבל לפעמים אנחנו רוצים שהתלות שלנו תיכלל בחפץ הסופי. בשביל מה? לדוגמה, יהיה לנו צנצנת הפעלה, שאמורה בעצמה להכיל את כל הדרוש. מה אם כן עלינו לעשות? ראשית, אין תמיכה כזו "מחוץ לקופסה" (כלומר, כברירת מחדל, ללא פעולות נוספות). זה מוסבר בעובדה שכל אחד רוצה לאסוף את הארכיון בדרכו שלו, וגרדל מנסה להיות מינימליסטי. אנחנו גם לא יכולים להשתמש בארכיוני jar ב-classpath (ללא מניפולציות נוספות בקוד), מכיוון זה לא עובד ככה (ראה " אורקל: הוספת מחלקות לנתיב ה-Class של קובץ JAR " לפרטים נוספים). לכן, הדרך היפה ביותר היא הקוד הבא בסקריפט הבנייה:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
בהגדרות המשימה של jar אנו מציינים מה יתווסף למניפסט קובץ ה-jar (ראה " אורקל: הגדרת נקודת הכניסה של יישום "). ואחר כך אנו אומרים שכל התלות שהיו דרושות להידור ייכללו בקנקן. חלופה היא להשתמש בתוסף "Gradle Shadow ". זה אולי נראה מסובך, אבל תוספים אחרים יכולים להקל על החיים. לדוגמה, בעת יצירת אפליקציית אינטרנט (בניגוד לאפליקציית Java הפועלת רגילה), נשתמש בתוסף מיוחד - " Gradle War Plugin ", שיש לו התנהגות שונה והחיים שלנו יהיו קלים יותר שם (כל התלות הנדרשת להכניס לספרייה מיוחדת נפרדת על ידי התוסף עצמו. עבודה כזו מוסדרת על ידי האופן שבו יש לבנות יישומי אינטרנט. אבל זה סיפור אחר לגמרי).
היכרות מהירה עם Gradle - 9

תוצאות

Gradle היא בחירה מצוינת למערכות בניית פרויקטים. זה מאושר על ידי העובדה שהוא משמש מפתחים של פרויקטים ידועים כמו Spring ו-Hibernate. רק הדברים הבסיסיים ביותר נדונו לעיל. מאחוריהם מסתתרים מיליון פיצ'רים והזדמנויות שיש למפתחים. Gradle תומכת גם ביצירת פרויקטים מרובי מודולים, שאינם מכוסים בסקירה זו, אך ל- Gradle עצמו יש מדריך מצוין: " יצירת מבנים מרובי פרויקטים ". אני מקווה שסקירה זו גם הוכיחה שהתיעוד של Gradle כתוב ב-5+ ואתה יכול למצוא בקלות את מה שאתה צריך אם אתה מבין היכן לחפש. וזה יבוא כשתבין את היסודות. בנוסף, ל- Gradle יש הדרכות מעולות. אני רוצה לסיים עם רשימה קטנה של מה עוד אתה יכול לראות באמצעות Gradle:
היכרות מהירה עם Gradle - 10
#ויאצ'סלב
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION