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

שני מקומות שבהם ההגדרה יכולה לחיות

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

PropertyPrefix on the commandExport from the hook
Who receives itThat invocation onlyChildren the hook starts
LifetimeUntil the process exitsUntil the hook's own session ends
LeakageScoped to one commandApplies to later commands in that session
Repeat costEvery invocationOnce per connection
Works for an open editorNo, unless the editor is started with itNo

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

למה הוו לא יכול להגיע ל-shell שכבר פתוח

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

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

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

הצורה לפקודה בודדת, כתובה במלואה

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

env INTERNAL_API='https://internal-api.example.net:8443' my-work-tool

הפקודה היא להמחשה: my-work-tool הוא מציין מקום ו-INTERNAL_API אינו תקן של VPN, לכן החליפו בהגדרה המתועדת של התוכנית שאתם באמת מריצים ובמארח המאושר שלכם. אל תשימו אסימון או סיסמה באותה שורה, כי הם מגיעים להיסטוריית ה-shell.

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

לטעון מחדש, להפעיל מחדש או להניח לזה

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

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

מאמרים קשורים