הגדרות כלי VPN: סביבה בזמן ההפעלה או ייצוא בתוך הוו?
וו מריץ את הילדים שלו, לא את ה-shell שכבר פתחתם. סביבה בזמן ההפעלה מחזיקה את נקודת הקצה הפרטית רק בפקודה האחת שזקוקה לה.
וו VPN שמייצא נקודת קצה של API משנה את הסביבה של התהליכים שהוא מפעיל, לא את זו של הטרמינל שכבר היה פתוח כשהמנהרה עלתה. ההבחנה האחת הזו מסבירה את רוב הדוחות "הכלי עדיין קורא לנקודת הקצה הציבורית". יש שני מקומות סבירים להציב בהם את ההגדרה, והבחירה תלויה במי צורך אותה ובתדירות שבה היא משתנה. השוו ביניהם לפני שתוסיפו סקריפט הפעלה נוסף.
שני מקומות שבהם ההגדרה יכולה לחיות
האפשרות הראשונה היא קידומת על הפקודה עצמה: הערך קיים לאותה קריאה אחת ונעלם איתה. האפשרות השנייה היא ייצוא בתוך וו החיבור, שמגיע לכל תהליך שהוו מפעיל לאחר אותה נקודה. הן נבדלות בהיקף ובמשך החיים, לא בתחביר, וההבדל הזה מכריע את רוב הכשלים.
| Property | Prefix on the command | Export from the hook |
|---|---|---|
| Who receives it | That invocation only | Children the hook starts |
| Lifetime | Until the process exits | Until the hook's own session ends |
| Leakage | Scoped to one command | Applies to later commands in that session |
| Repeat cost | Every invocation | Once per connection |
| Works for an open editor | No, unless the editor is started with it | No |
הטבלה גורמת לוו להיראות זול ומסתירה את החשבון האמיתי: הוא בוחר נקודת קצה פרטית גם לפקודות שאין להן שום קשר למשימה. קראו כל שורה כמגבלה ולא כהעדפה. אם נקודת הקצה משתנה לפי משימה, הקידומת מנצחת בדיוק גם אם היא עולה בהקשה אחת.
למה הוו לא יכול להגיע ל-shell שכבר פתוח
משתני סביבה נמסרים לתהליך כשנוצרת תמונת התהליך. shell שהתחיל לפני החיבור שומר על העותק שקיבל, וייצוא שמבוצע בתוך הוו אינו שידור לכל תהליך במחשב. רק הילדים של הוו עצמו יורשים אותו. הילדים של ה-shell לוקחים את מה שה-shell מחזיק ברגע ההפעלה שלהם, ולכן אותה פקודה יכולה לעבוד בטרמינל אחד ולהיכשל באחר.
אותו דבר חל על עורך גרפי. מארח התוספים, הטרמינל המוטמע ושרת השפה ברקע התפצלו בהפעלה ומחזיקים עותקים משלהם. פתיחה מחדש של תיקייה לא בהכרח מפעילה מחדש את הילדים האלה, ולכן ההגדרה שהוספתם עדיין לא מגיעה.
הבדיקה הזולה ביותר היא להדפיס את המשתנה מהמקום שנכשל, לא מה-shell שעובד. אם התהליך שנכשל התחיל לפני המנהרה, לייצוא לא היה שום סיכוי.
הצורה לפקודה בודדת, כתובה במלואה
קידומת משאירה את הבחירה גלויה בפקודה שמשתמשת בה, וזה עוזר כשנקודת הקצה משתנה בין משימות:
env INTERNAL_API='https://internal-api.example.net:8443' my-work-tool
הפקודה היא להמחשה: my-work-tool הוא מציין מקום ו-INTERNAL_API אינו תקן של VPN, לכן החליפו בהגדרה המתועדת של התוכנית שאתם באמת מריצים ובמארח המאושר שלכם. אל תשימו אסימון או סיסמה באותה שורה, כי הם מגיעים להיסטוריית ה-shell.
כשכמה פקודות שייכות למשימה אחת, סקריפט עטיפה קצר שנבדק מגדיר את המשתנים ואז מפעיל אותם. כך נשמרת הגדרה אחת בלי להפוך את הערך לגלובלי לכל פקודה עתידית בטרמינל.
לטעון מחדש, להפעיל מחדש או להניח לזה
לכלי שכבר רץ, העדיפו את הטעינה מחדש או פרופיל מרחב העבודה שלו כשיש לו כזה. אחרת שמרו את העבודה והפעילו מחדש את הרכיב שקורא את ההגדרה, שלעתים קרובות הוא שרת שפה ולא חלון העורך. הפעלה מחדש של החלון בהנחה שתהליכי הבן הלכו אחריו היא בדיוק הסיבה לכך שטעינה מחדש נראית כאילו אינה עובדת.
התנתקות היא החלטה נפרדת. השהיה, סגירה או התחברות מחדש שייכות ליישום, ומשתנה נקודת הקצה אינו שולט בכך. התייחסו למשתנה כאל תצורה שבוחרת כתובת, לא כאל כלל לגבי איזו תעבורת רשת מותר להשתמש בה לאחר מכן, ושתי הסוגיות נשארות ניתנות להפרדה.