CLI עם מעטפת אביב

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

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

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

2. תלות של Maven

ראשית, עלינו להוסיף את אביב-קליפה תלות שלנו pom.xml:

 org.springframework.shell spring-shell 1.2.0.RELEASE 

הגרסה האחרונה של חפץ זה נמצאת כאן.

3. גישה למעטפת

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

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

ראשי ריק סטטי ציבורי (String [] args) זורק IOException {Bootstrap.main (args); }

השנייה היא להשיג א JLineShellComponent ולבצע את הפקודות באופן פרוגרמטי:

Bootstrap bootstrap = חדש Bootstrap (); מעטפת JLineShellComponent = bootstrap.getJLineShellComponent (); shell.executeCommand ("עזרה");

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

4. פקודות

ישנן כבר כמה פקודות מובנות במעטפת, כגון ברור, עֶזרָה, יְצִיאָהוכו ', המספקים את הפונקציונליות הסטנדרטית של כל CLI.

ניתן לחשוף פקודות מותאמות אישית על ידי הוספת שיטות המסומנות ב- @CliCommand ביאור בתוך רכיב אביב המיישם את CommandMarker מִמְשָׁק.

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

4.1. הוספת פקודות למעטפת

ראשית, עלינו ליידע את המעטפת היכן נמצאים הפקודות שלנו. לשם כך, זה דורש את הקובץ META-INF / spring / spring-shell-plugin.xml כדי להיות נוכחים בפרויקט שלנו, שם, נוכל להשתמש בפונקציונליות סריקת הרכיבים של אביב:

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

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

מחלקה ציבורית @Component SimpleCLI מיישמת את CommandMarker {@CliCommand (value = {"web-get", "wg"}) public String webGet (@CliOption (key = "url") URL String) {return getContentsOfUrlAsString (url); } @ ClientCommand (value = {"web-save", "ws"}) public String webSave (@CliOption (key = "url") url String, @ CliOption (key = {"out", "file"}) String קובץ) {תוכן מחרוזת = getContentsOfUrlAsString (url); נסה (PrintWriter out = חדש PrintWriter (קובץ)) {out.write (תוכן); } להחזיר "בוצע."; }}

שים לב שנוכל להעביר יותר ממחרוזת אחת ל- ערך ו מַפְתֵחַ תכונות של @CliCommand ו @ CliOption בהתאמה, הדבר מאפשר לנו לחשוף כמה פקודות וטיעונים המתנהגים זהים.

עכשיו, בואו נבדוק אם הכל עובד כמצופה:

spring-shell> web-get --url //www.google.com save-web --url //www.google.com --out contents.txt בוצע.

4.2. זמינות פקודות

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

ראשית, בואו ניצור שיטה לשינוי זמינות ה- שמור באינטרנט פקודה:

admin בוליאני פרטיEnableExecuted = false; @CliAvailabilityIndicator (value = "save-web") בוליאני ציבורי isAdminEnabled () {return adminEnableExecuted; }

כעת, בואו ניצור פקודה לשינוי ה- adminEnableExecuted מִשְׁתַנֶה:

@CliCommand (value = "admin-enable") ציבורי מחרוזת adminEnable () {adminEnableExecuted = true; להחזיר "פקודות מנהל מופעלות."; }

לבסוף, בואו נוודא את זה:

spring-shell> web-save --url //www.google.com --out contents.txt הפקודה 'שמירת רשת - url //www.google.com --out contents.txt' נמצאה אך לא זמין כרגע (הקלד 'עזרה' ואז ENTER כדי ללמוד אודות פקודה זו) spring-shell> הפעלת פקודות admin להפעלת admin. spring-shell> save-web --url //www.google.com --out contents.txt בוצע.

4.3. ויכוחים נדרשים

כברירת מחדל, כל טיעוני הפקודה הם אופציונליים. עם זאת, אנו יכולים להפוך אותם לנדרשים באמצעות ה- חובה תכונה של @CliOption ביאור:

@CliOption (key = {"out", "file"}, חובה = true)

כעת נוכל לבדוק שאם לא נציג אותה, התוצאה היא שגיאה:

spring-shell> web-save --url //www.google.com עליך לציין אפשרות (--out) עבור פקודה זו

4.4. טיעוני ברירת מחדל

ריק מַפְתֵחַ ערך עבור a @CliOption הופך את הטיעון הזה לברירת המחדל. שם נקבל את הערכים שהוצגו בקליפה שאינם חלק מכל טיעון בשם:

@CliOption (key = {"", "url"})

עכשיו, בואו נבדוק שזה עובד כמצופה:

spring-shell> web-get //www.google.com 

4.5. עזרה למשתמשים

@CliCommand ו @ CliOption ההערות מספקות א עֶזרָה תכונה המאפשרת לנו להדריך את המשתמשים שלנו בעת השימוש במובנה עֶזרָה פקודה או בעת לשונית כדי לקבל השלמה אוטומטית.

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

@CliCommand (// ... help = "מציג את תוכן כתובת ה- URL") public String webGet (@CliOption (// ... help = "URL שתוכנו יוצג.") URL String) {//. ..}

כעת המשתמש יכול לדעת בדיוק מה הפקודה שלנו עושה:

spring-shell> help web-get מילות מפתח: web-get מילות מפתח: wg תיאור: מציג את תוכן כתובת האתר. מילת מפתח: ** ברירת מחדל ** מילת מפתח: url עזרה: URL שתוכנו יוצג. חובה: שקר ברירת מחדל אם צוין: '__NULL__' ברירת מחדל אם לא צוין: '__NULL__' * קבל אינטרנט - מציג את תוכן כתובת האתר. * wg - מציג את תוכן כתובת האתר.

5. התאמה אישית

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

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

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

מחלקה ציבורית @Component @Order (Ordered.HIGHEST_PRECEDENCE) מרחיב SimpleBannerProvider מרחיב DefaultBannerProvider {public String getBanner () {StringBuffer buf = new StringBuffer (); buf.append ("===========================================") .append (OsUtils .LINE_SEPARATOR); buf.append ("* מעטפת Baeldung *") .append (OsUtils.LINE_SEPARATOR); buf.append ("==========================================") .append (OsUtils .LINE_SEPARATOR); buf.append ("גרסה:") .append (this.getVersion ()); החזר buf.toString (); } ציבורי מחרוזת getVersion () {להחזיר "1.0.1"; } מחרוזת ציבורית getWelcomeMessage () {חזרה "ברוך הבא ל- Baeldung CLI"; } ציבורי מחרוזת getProviderName () {להחזיר "באנרד באלדונג"; }}

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

עכשיו, בואו לשנות את ההנחיה:

מחלקה ציבורית @Component @Order (Ordered.HIGHEST_PRECEDENCE) SimplePromptProvider מרחיב את DefaultPromptProvider {public String getPrompt () {להחזיר "baeldung-shell"; } ציבורי מחרוזת getProviderName () {להחזיר "בקשת Baeldung"; }}

לבסוף, בואו ונשנה את שם קובץ ההיסטוריה:

@Component @Order (Ordered.HIGHEST_PRECEDENCE) מחלקה ציבורית SimpleHistoryFileNameProvider מרחיב את DefaultHistoryFileNameProvider {public String getHistoryFileName () {return "baeldung-shell.log"; } ציבורי מחרוזת getProviderName () {להחזיר "היסטוריית באלדונג"; }}

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

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

========================================== * מעטפת Baeldung * ======= ================================= גרסה: 1.0.1 ברוכים הבאים ל- Baeldung CLI baeldung-shell>

6. ממירים

עד כה השתמשנו רק בסוגים פשוטים כטיעונים לפקודות שלנו. סוגים נפוצים כגון מספר שלם, תַאֲרִיך, Enum, קוֹבֶץוכו ', יש כבר ממיר ברירת מחדל רשום.

על ידי יישום ה- מֵמִיר ממשק, אנו יכולים גם להוסיף את הממירים שלנו כדי לקבל אובייקטים מותאמים אישית.

בואו ניצור ממיר שיכול להפוך א חוּט לתוך כתובת אתר:

מחלקה ציבורית @Component SimpleURLConverter מיישם ממיר {URL URL ציבורי convertFromText (ערך מחרוזת, Class requiredType, מחרוזת optionContext) {להחזיר URL חדש (ערך); } getAllPossibleValues ​​ציבורי בוליאני (השלמות רשימה, Class requiredType, String existingData, String optionContext, MethodTarget target) {return false; } תומכים בוליאניים ציבוריים (Class requiredType, String optionContext) {return URL.class.isAssignableFrom (requiredType); }}

לבסוף, בואו לשנות את שלנו קבל באינטרנט ו שמור באינטרנט פקודות:

public String webSave (... URL url) {// ...} public String webSave (... URL url) {// ...}

כפי שאולי ניחשתם, הפקודות מתנהגות זהה.

7. מסקנה

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

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


$config[zx-auto] not found$config[zx-overlay] not found