משתני סביבה, קובץ ENV, או קובץ JSON
-
@yossiz אמר ביצירת פרויקט nodeJS שיבקש מהמשתמש קונפיג בהרצה הראשונה:
כבר ענו, אבל מכיון שכבר כתבתי את התשובה שלי אוסיף אותה לערימה...
@צדיק-תמים
א) הזכרת בשאלה ששם הקובץ יהיה config.env, זה מעלה בי חשד שאתה מתכנן שזה יהיה בפורמט של קבצי .env. אני מציע להיצמד ל-json כי זה פורמט שנתמך בצורה מובנית ב-JS וקל לכתוב אותו לקובץ.יפה, זה גם מה שאני המלצתי לך מזמן. אבלהלכת בעקבות מדריך כלשהו, שבחר להשתמש בENV מסיבותיו הוא.
אם משתמש בקובץ JSON יש לזה מעלה נוספת, אין צורך לתת למשתמש PROMPT, לא להכביד עליו ולא עליך, אתה מניח קובץ קונפיג מוכן ומאפשר לו לשנות שם את ההגדרות, שידרסו את ברירת המחדל שלך (אני מניח שזו לא משימה מורכבת למי שאמור לדעת להריץ NPM משורת פקודה).
יש לזה יתרון נוסף, אתה יכול לקבל ממני קוד מוכן שעושה את זה
-
@davidnead דווקא לא הלכתי בעקבות שום מדריך... נראה לי אתה מחליף עם הnodemon.json...
לתת קונפיג מוכן ושהמשתמש ישנה אני יכול גם בenv.
... ושם זה אף יותר קל, כי לפי מה שהבנתי הגדרת משתנה סביבה בשם הזה דורסת את ההגדרה בקובץ...
אני משתמש בקבציenv.
של dotenv, בהתחלה עשיתי json ועשיתי לו require, ואז החלפתי לזה... -
@צדיק-תמים אמר ביצירת פרויקט nodeJS שיבקש מהמשתמש קונפיג בהרצה הראשונה:
@davidnead דווקא לא הלכתי בעקבות שום מדריך... נראה לי אתה מחליף עם הnodemon.json...
לתת קונפיג מוכן ושהמשתמש ישנה אני יכול גם בenv.
... ושם זה אף יותר קל, כי לפי מה שהבנתי הגדרת משתנה סביבה בשם הזה דורסת את ההגדרה בקובץ...
אני משתמש בקבציenv.
של dotenv, בהתחלה עשיתי json ועשיתי לו require, ואז החלפתי לזה...על זה דיברתי, על השימוש במשתני סביבה. בעיני הוא מיותר לגמרי. כמובן, יש שימושים מסוימים שהוא מתאים להם, אבל לא התרשמתי פה שיש סיבה. למשל לא רואה שום סיבה להכניס פרטי חיבור למסד נתונים במשתני סביבה.
אני מבין שהתשובות פה לא מספקות עבורך. תוכל לפרט למה? למה היית מצפה ומה אתה רוצה להשיג?
-
@davidnead יתרון שיש בהגדרה במשתני סביבה זה שאפשר לעשות את זה עם ה
app.json
של הרקו ואז יהיה אפשר להרים אינסטנס של זה בלחיצת כפתור, כשהממשק של הרקו מבקש את המשתני סיסבה. את זה לא ידעתי כשכתבתי את הפוסט כאן, ולכן חיפשתי דרך אחרת להגדרת קונפיג ידידותית.
למעשה אולי מה שכתבו פה יהיה שימושי לי בעתיד...
כי אני מבין שזה לא הולך יחד - הjson והמשתני סביבה. -
@davidnead זה סוג של מוסכמה לאפשר הגדרה דרך משתני סביבה. ויש סיבות טובות. עיין: https://12factor.net/config
ואין בשימוש ב-dotenv שום חסרון כל עוד הקובץ לקריאה בלבד. ברגע שאתה מתחיל לדבר על קינפוג דינאמי דרך ממשק שיכתוב לקובץ, אז כדאי לשקול שוב. -
@davidnead אמר ביצירת פרויקט nodeJS שיבקש מהמשתמש קונפיג בהרצה הראשונה:
לא רואה שום סיבה להכניס פרטי חיבור למסד נתונים במשתני סביבה.
אלא מה? לחשוף אותו בקוד?
זה אחד הדברים שצריכים להיות במשתני סביבה.
זה יכול להיות מסיבות אבטחה - וגם מסיבות של הבדלים בין סביבות פיתוח/ריצה.
השימוש בקונפיג על קובץ .env הוא פשוט פאטץ' על גבי הצורך בהגדרה של משתני סביבה שאתה כן רוצה משום מה, להכניס ישירות לקוד.
או שזה פשוט נעשה לך ממשק נוח להגדרת משתני סביבה בסביבת פיתוח.
וזה לא נכנס לגיט, כמובן!! -
@chv אמר ביצירת פרויקט nodeJS שיבקש מהמשתמש קונפיג בהרצה הראשונה:
@davidnead אמר ביצירת פרויקט nodeJS שיבקש מהמשתמש קונפיג בהרצה הראשונה:
לא רואה שום סיבה להכניס פרטי חיבור למסד נתונים במשתני סביבה.
אלא מה? לחשוף אותו בקוד?
להכניס בקובץ קונפיג שלא נכנס לגיט. בדיוק כמו קובץ ENV שלא נכנס לגיט.
זו דרך קלאסית שראיתי בדי והותר פרויקטים. אני מודע לזה שלא כל הידע העולמי נמצא ברשותי.אגב, @yossiz , בקישור שנתת הוא גם מזכיר את הדרך של קובץ קונפיג (בפורמט YML), אם כי הוא טוען שהיא פחות מומלצת.
הטיעונים שהוא מזכיר הם בהחלט הגיוניים, ורלוונטים מאוד לפרוייקטים שמתמודדים עם קשיים שהוא הציג. די מיותר בפרוייקטים "פשוטים" יותר.רם הצורך של @צדיק-תמים נובע מהרקו, שכנראה לא מאפשר עריכת קבצי קונפיג (אם הבנתי נכון, לא מכיר אותו) אז כנראה ממשק שורת פקודה הוא פתרון (אחד), רק פתרון לא נוח בעליל. וגם לגבי זה - הממשק יכול לשמש לשם הגדרת משתני סביבה ממש כשם שהוא יכול לשמש לקלוט הגדרות ישירות אל תוך משתנים. וגם אם הוא כן רוצה להכניס אותם לתוך משתני סביבה, למה לכתוב אותם אל תוך הקובץ? היינו הך לקלוט אותם ישירות לקוד. ובכלל, למה לכתוב מידע משתנה אל תוך קובץ קשיח?
אקיצור קובץ ENV, כמו כל קובץ הגדרות אחר, מועיל או במקרה שמתאפשרת עריכה ישירה של הקובץ, או במקרה של התקנה ראשונית שתאפשר לאחר מכן באופן קבוע להריץ את הפרויקט עם אותם משתנים.למשתני סביבה יש למשל יתרון כאשר קובעים אותם ומשתמשים בהם ליותר מהרצה אחת או אפליקציה אחת. הגדרה חד פעמית (גם אם זמנית) של משתני סביבה, ללא מגע ישיר עם האפליקציה וללא תלות בטכנולוגיה שלה, והאפליקציה יכולה כבר לגשת אליהם בצורה אחידה. ממש כמו משתני הסביבה הקבועים של המערכת הנותנים נתיבים והגדרות קבועות בלי שהאפליקציה או המשתמש צריכים לטפל בהם.
מקרה נוסף שהייתי משתמש במשתני סביבה זה אם אני רוצה את משתני המערכת, ורוצה לאפשר ללקוח לדרוס אותם בצורה אופציונלית.
-
כנראה הפתרון הכי טוב שמשתלב גם עם אפשרות קונפיג עם פרומפטים וגם תואם להגדרת המשתני סביבה שיש בהרקו, זה בקוד תמיד לקחת את הקונפיג מהמשתנה סביבה, ואם יש קונפיג ב-json, הוא יוגדר כמשתני סביבה
וממילא בהרקו לא יהיה צריך לעשות config אלא יהיה אפשר להגדיר משתני סביבה, ומצד שני בהרצה לוקאלית יהיה אפשר להגדיר קונפיג ב-json והוא יהפוך למשתני סביבה.