การกำหนดค่าด้วยตัวแปรสภาพแวดล้อม
สารบัญ:
สรุป
ประเด็น
เราต้องการให้แอปพลิเคชันของเรากำหนดค่าได้นอกเหนือจากผลงาน/ไบนารี/ซอร์ส เพื่อให้การสร้างครั้งเดียวทำงานต่างกันได้ขึ้นอยู่กับสภาพแวดล้อมการติดตั้งใช้งาน
เพื่อบรรลุสิ่งนี้ เราต้องการใช้การกำหนดค่าด้วยตัวแปรสภาพแวดล้อม
เราต้องการจัดการการกำหนดค่าโดยใช้ไฟล์ที่เราควบคุมเวอร์ชันได้
เราต้องการให้ความสะดวกด้านประสบการณ์นักพัฒนาบางอย่าง เช่น การรู้ว่ากำหนดค่าอะไรได้และค่าเริ่มต้นที่เกี่ยวข้อง
การตัดสินใจ
ตัดสินใจเลือกไฟล์ .env พร้อมไฟล์ค่าเริ่มต้นและไฟล์สคีมาที่เกี่ยวข้อง
สถานะ
ตัดสินใจแล้ว เปิดรับการพิจารณาความสามารถใหม่เมื่อมีขึ้น
รายละเอียด
สมมติฐาน
เราชอบแยกโค้ดแอปพลิเคชันและโค้ดสภาพแวดล้อม เราสันนิษฐานว่าแอปต้องทำงานต่างกันในสภาพแวดล้อมต่าง ๆ เช่น สภาพแวดล้อมการพัฒนา สภาพแวดล้อมการทดสอบ สภาพแวดล้อมสาธิต สภาพแวดล้อมการผลิต ฯลฯ
เราชอบแนวปฏิบัติของอุตสาหกรรม "12 factor app" และยิ่งกว่านั้นคือแนวปฏิบัติที่เกี่ยวข้อง "15 factor app"
โครงการก่อนหน้าของเราหลายโครงการใช้ข้อตกลงของไฟล์ .env หรือไดเรกทอรี .env ที่คล้ายกัน เป็นแนวปฏิบัติทั่วไปที่จะเก็บไฟล์เหล่านี้ไว้นอกการควบคุมเวอร์ชัน และใช้วิธีอื่นในการติดตั้งใช้งาน กำหนดเวอร์ชัน และจัดการแทน
ข้อจำกัด
เราต้องการเก็บความลับไว้นอกระบบควบคุมเวอร์ชัน (VCS) สำหรับการจัดการซอร์สโค้ด (SCM) ของเรา
เรามุ่งหวังความเข้ากันได้กับเฟรมเวิร์กและไลบรารีซอฟต์แวร์ยอดนิยม เช่น Node มีโมดูล "dotenv" สำหรับอ่านการกำหนดค่าด้วยตัวแปรสภาพแวดล้อม
จุดยืน
เราพิจารณาแนวทางบางอย่าง:
จัดเก็บการกำหนดค่าในแอป เช่น ในไฟล์
config.jsจัดเก็บการกำหนดค่าในสภาพแวดล้อม เช่น ในไฟล์
.envดึงการกำหนดค่าจากตำแหน่งที่ทราบ เช่น เซิร์ฟเวอร์ใบอนุญาต
ข้อโต้แย้ง
เราเลือกแนวทางไฟล์ .env เพราะ:
เป็นที่นิยม รวมถึงในหมู่ผู้เชี่ยวชาญ
เป็นไปตามรูปแบบของไฟล์
.envที่ทีมของเราใช้สำเร็จหลายครั้งในหลายโครงการเรียบง่าย โดยเฉพาะอย่างยิ่ง ตอนนี้เรารับข้อแลกเปลี่ยนที่สำคัญที่เราเห็นได้ เช่น การขาดความสามารถด้านการตรวจสอบเมื่อเทียบกับแนวทางเซิร์ฟเวอร์ใบอนุญาต
นัยยะ
เราต้องหาวิธีแยกการกำหนดค่าด้วยตัวแปรสภาพแวดล้อมที่เป็นสาธารณะออกจากการจัดการความลับ
ที่เกี่ยวข้อง
การตัดสินใจที่เกี่ยวข้อง
เราคาดว่าแอปพลิเคชันทั้งหมดของเราจะใช้แนวทางนี้
เราจะวางแผนอัปเกรดแอปพลิเคชันของเราที่ใช้แนวทางที่มีความสามารถน้อยกว่า เช่น การฝังค่าในไบนารีหรือซอร์สโค้ด
เราจะคงแอปพลิเคชันของเราที่ใช้แนวทางที่มีความสามารถมากกว่า เช่น เซิร์ฟเวอร์ใบอนุญาต ไว้ตามเดิม
ข้อกำหนดที่เกี่ยวข้อง
เราจะเพิ่มความสามารถด้าน devops สำหรับไฟล์ รวมถึง hook การทดสอบ และการรวมระบบอย่างต่อเนื่อง
เราต้องฝึกอบรมเพื่อนร่วมทีมนักพัฒนาทั้งหมดเกี่ยวกับการตัดสินใจนี้
ผลงานที่เกี่ยวข้อง
แต่ละพื้นที่ที่เราติดตั้งใช้งานจะต้องมีไฟล์ .env และไฟล์ที่เกี่ยวข้องของตนเอง
หลักการที่เกี่ยวข้อง
ย้อนกลับได้ง่าย
หมายเหตุ
ไฟล์ตัวอย่าง .env:
NAME=Alice Anderson
EMAIL=alice@example.com
ไฟล์ตัวอย่าง .env.defaults:
NAME=Joe Doe
EMAIL=joe@example.com
ไฟล์ตัวอย่าง .env.schema ที่มีเฉพาะคีย์:
NAME
EMAIL